duyler / dependency-injection
Dependency injection container
Installs: 1 322
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
Requires
- php: >=8.3
- psr/container: ^1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.30
- phpunit/phpunit: ^10.0
- vimeo/psalm: ^6.0
This package is auto-updated.
Last update: 2025-05-05 04:17:42 UTC
README
Duyler Dependency Injection Container
A modern, flexible, and type-safe dependency injection container for PHP applications. This container implements the PSR-11 Container Interface and provides additional features for dependency management.
Features
- PSR-11 Container Interface implementation
- Type-safe dependency injection
- Provider-based service registration
- Support for interface bindings
- Service finalization
- Reflection caching
- Dependency tree visualization
- Strict type checking
Installation
composer require duyler/dependency-injection
Basic Usage
Simple Container Usage
use Duyler\DI\Container; $container = new Container(); // Register a service $container->set(new MyService()); // Get a service $service = $container->get(MyService::class);
Using Container Configuration
use Duyler\DI\Container; use Duyler\DI\ContainerConfig; $config = new ContainerConfig(); $config ->withBind([ MyInterface::class => MyImplementation::class, ]) ->withProvider([ AnotherInterface::class => MyProvider::class, ]); $container = new Container($config);
Creating a Service Provider
use Duyler\DI\Provider\ProviderInterface; use Duyler\DI\ContainerService; class MyServiceProvider implements ProviderInterface { public function getArguments(ContainerService $containerService): array { return [ 'dependency' => $containerService->getInstance(Dependency::class), ]; } public function bind(): array { return [ MyInterface::class => MyImplementation::class, ]; } public function accept(object $definition): void { // Handle definition if needed } public function finalizer(): ?callable { return function (MyImplementation $service) { // Perform finalization $service->finalize(); }; } public function factory(ContainerService $containerService): ?object { return new MyImplementation( $containerService->getInstance(Dependency::class) ); } }
Using Service Definitions
use Duyler\DI\Definition; $definition = new Definition( MyService::class, [ 'dependencyOne' => new AnotherService(), 'dependencyTwo' => 'Hello, World!', ] ); $container->addDefinition($definition);
Service Finalization
use Duyler\DI\Attribute\Finalize; #[Finalize] class MyService { public function finalize(): void { // Finalization logic } } // Or using container method $container->addFinalizer(MyService::class, function (MyService $service) { $service->finalize(); }); // Execute finalizers $container->finalize();
Resetting Container
// Reset all services and providers $container->reset();
Getting Dependency Tree
// Get the dependency tree for a specific class $tree = $container->getDependencyTree();
Dependency Mapping
// Get current class mappings $container = new Container(); $myObject = $container->get(MyClass::class); $classMap = $container->getClassMap();
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
This project is licensed under the MIT License - see the LICENSE file for details.