domainflow / core
A lightweight PHP application bootstrapper with service providers, boot phases, middleware, and config management.
Requires
- php: ^8.4
- domainflow/container: ^0.2.1
- symfony/yaml: ^7.4.12 || ^8.0.12
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.70
- mikey179/vfsstream: ^1.6
- nikic/php-parser: ^5.4
- phpstan/phpstan: ^2.1
- phpstan/phpstan-deprecation-rules: ^2.0
- phpunit/phpunit: ^13.0
- symfony/phpunit-bridge: ^8.0
README
The DomainFlow Core package is a Lightweight Application Bootstrapper with features like Service Providers, Application Bootstrapping, Middleware, Event Management, and Configuration Management to help structure and maintain PHP back-end applications and microservices.
⚙️ Requirements
- PHP 8.4 or 8.5
✨ Core Functionality
-
Application Container
Inherits all DI capabilities from DomainFlow Container, including class auto-wiring, singleton bindings, and contextual bindings. -
Service Providers
Register and configure your services, including deferred loading for improved performance (load services only when first requested). Providers may opt intoOrderedServiceProviderInterfaceto guarantee that declared dependencies register and boot before their dependents. -
Bootstrapping & Lifecycle Management
Built-in support for structured boot phases and graceful termination. -
Event Management
A basic but extendable event dispatcher to publish and subscribe to application events. -
Configuration & Environment Management
Manage environment variables, base paths, and config paths out of the box. -
Caching
Optionally persist validated, versioned class-string bindings across processes viaFileContainerCache, a filesystem-backed adapter for DomainFlow Container's declarative definitions cache ($app->setExternalCache(new FileContainerCache($path))). Tracked definition files use exact mtime plus SHA-256 fingerprints, and a stable lock serializes concurrent cache mutations. A warm cache hit never skips the boot lifecycle and never re-hydrates a resolved object — only class-string bindings and aliases are restored, and every service is still resolved fresh through the normal container path.
📦 Installation
Install DomainFlow Core with Composer:
composer require domainflow/core
🧪 Example Usage
Below is a minimal example demonstrating how to set up an application, register a service provider, and retrieve a service:
<?php use DomainFlow\Application; use DomainFlow\Service\AbstractServiceProvider; // 1. Define the service your provider will register. class MyService { public function doSomething(): string { return 'done'; } } // 2. Define your own service provider. AbstractServiceProvider only requires // register(); boot(), provides(), and isDeferred() already have usable // defaults (isDeferred() reflects $defer below). class MyServiceProvider extends AbstractServiceProvider { protected array $providedServices = [MyService::class]; public bool $defer = true; // Lazy loading, only load on first use public function register(Application $app): void { // Bind a service... $app->bind(MyService::class, fn() => new MyService(), true); } } // 3. Create a new application. $app = new Application(); // 4. Register your provider. $app->registerProvider(new MyServiceProvider()); // 5. Boot the application (register event listeners, run boot callbacks, etc.). $app->boot(); // 6. Get your service. $service = $app->get(MyService::class); $service->doSomething();
More details and usage examples can be found in our DomainFlow Core documentation.
🛡 License
DomainFlow Core is open-sourced software licensed under the MIT license.