适用于php项目的简单依赖注入容器

v1.3.0 2022-05-15 10:36 UTC

This package is auto-updated.

Last update: 2024-09-09 07:34:53 UTC


README

Build Status Coverage Status

适用于php项目的简单依赖注入容器

安装

composer require njeaner/di-container

如何使用它

容器初始化

不带参数初始化

$container = new \NJContainer\Container\Container();

使用参数初始化

容器可以用以下方式构建

  • @param \NJContainer\Container\InstanceDefinition|null $instance

NJContainer\Container\InstanceDefinition 可以用以下方式构建

  • @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);

在容器中设置依赖项

设置一个定义

/**
 * @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)

使用定义数组设置多个定义

/**
 * @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)

使用返回定义数组的文件设置多个定义

/**
 * @param string $definitionsPath, path directory of definition file
*/
$container->addDefinition($definitionsPath)

设置依赖参数

设置别名的一个参数

/**
 * @param string $id definition id
 * @param string $name parameter name
 * @param mixed $parameter param value to set in definition
*/
$container->setParameter($id, $name, $parameter)

设置别名的一个参数

/**
 * @param string $id definition id
 * @param array $parameters
*/
$container->setParameters($id, $parameters)

从容器中获取依赖项

/**
 * @param string $id
 * @param bool $shared, if "true" container with retrieve a factory dependency
*/
$container->get($id)
$container->get($id, true)

使用示例

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);