njeaner / di-container
A simple dependency injection container for php projects
v1.3.0
2022-05-15 10:36 UTC
Requires
- php: >=7.3
- psr/container: >=1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.16
- php-coveralls/php-coveralls: ^2.2
- phpunit/phpunit: ^9.2
- squizlabs/php_codesniffer: ^3.5
README
A simple dependency injection container for php projects
Installation
composer require njeaner/di-container
How to use it
Container Initialization
Initialize without parameter
$container = new \NJContainer\Container\Container();
Initialize using the parameter
The container can be constructed with:
- @param \NJContainer\Container\InstanceDefinition|null $instance
and NJContainer\Container\InstanceDefinition can be constructed with:
- @param \NJContainer\Container\ContainerDefinition|null
$containerDefinition = new \NJContainer\Container\ContainerDefinition(); $instance = new \NJContainer\Container\InstanceDefinition(); // or $instance = new \NJContainer\Container\InstanceDefinition($containerDefinition); $container = new \NJContainer\Container\Container($instance);
Setting a dependency in the container
Setting one definition
/** * @param id string * @param mixed $definition * @param bool $shared, if "true" container will save this definition instance as a factory dependency */ $container->set($id, $definition) $container->set($id, $definition, true)
Setting several definition using an array of definitions
/** * @param <string, array> $definitions * @example [ * 'name'=> ['John Doe'], * 'stdClass1' => [new stdClass()], * \Namespace\Route::class => [new \Namespace\Route(), true] * ]; * The true value as second item in dependency array means that you are storing an= factory dependency */ $container->add($definitions)
Setting several definition using an file with return an array of definitions
/** * @param string $definitionsPath, path directory of definition file */ $container->addDefinition($definitionsPath)
Setting dependency parameters
Setting a parameter of an alias
/** * @param string $id definition id * @param string $name parameter name * @param mixed $parameter param value to set in definition */ $container->setParameter($id, $name, $parameter)
Setting several parameter of an alias
/** * @param string $id definition id * @param array $parameters */ $container->setParameters($id, $parameters)
Getting a dependency from the container
/** * @param string $id * @param bool $shared, if "true" container with retrieve a factory dependency */ $container->get($id) $container->get($id, true)
Use example
class Foo{ } class Bar { public function __construct(Foo $foo, $type = 'Bar'){ $this->foo = $foo; $this->type = $type } } class FooBar{ public function __construct(Foo $foo , string $name, array $params){ } }
# config.php # dependency configuration file <?php return [ 'name'=> 'John Doe', FooBar::class => get()->setParameters( 'name' => get('name'), 'params' => ['type' => FooBar::class] ) ];
$container = new \NJContainer\Container\Container(); $container->addDefinition('config.php'); $arrayDefinition = [ FooBar::class => get()->setParameters( 'params' => add(['bool' => false]) ) ]; $container->add($arrayDefintion); $container->lock(); $fooObject = $container->get(Foo::class); $barObject = $container->get(Foo::class); // Foo::class and Bar::class has been resolved using autowiring $foobar = $container->get(FooBar::class);