nia/dependencyinjection

nia 组件用于处理依赖注入。

此包的官方仓库似乎已消失,因此该包已被冻结。

1.0.0 2016-02-06 23:59 UTC

This package is not auto-updated.

Last update: 2022-03-09 06:05:46 UTC


README

易于使用的依赖注入处理。

安装

使用 Composer 需要此包。

	composer require nia/dependencyinjection

注意

此组件不使用注解、配置文件或其他“黑魔法”进行类实例化 - 只是普通的可重用代码。此组件仅提供 服务,没有参数,因为参数可以用映射或配置组件封装。

测试

要运行单元测试,请使用以下命令

$ cd /path/to/nia/component/
$ phpunit --bootstrap=vendor/autoload.php tests/

示例:注册服务

以下示例展示了如何注册一个非共享服务。服务将在每个服务请求时创建。

    $container = new Container();

    // register a non shared uuid generator - non shared because time() must be called every time.
    $container->registerService(UuidGeneratorInterface::class, new ClosureFactory(function(ContainerInterface $container) {
        return new TimeBasedUuidGenerator(time());
    }));

    // get the service and generate a new uuid.
    $uuid = $container->get(UuidGeneratorInterface::class)->generate();

示例:注册提供者

以下示例展示了如何实现提供者接口和共享服务的使用。对于共享服务,不需要使用 static 关键字,只需使用 Nia\DependencyInjection\Factory\SharedFactory 装饰器。

    class DatabaseProvider implements ProviderInterface
    {
        public function register(ContainerInterface $container) {
            // register a shared PDO connection.
            $container->registerService(PDO::class, new SharedFactory(new ClosureFactory(function(ContainerInterface $container){
                // [...]
                return new PDO($ds, $username, $password, $options);
            })));
        }
    }

    $container = new Container();
    $container->registerProvider(new DatabaseProvider());

    $pdo = $container->get(PDO::class);

示例:扩展服务工厂。

在这个示例中,您将看到如何使用 Nia\DependencyInjection\Extender\ClosureExtender 实现修改服务工厂。对于您自己的扩展实现,您必须实现 Nia\DependencyInjection\Extender\ExtenderInterface 接口。

    $container = new Container();

    // register a non shared logger implementation.
    $container->registerService(LoggerInterface::class, new ClosureFactory(function(ContainerInterface $container) {
                // [...]
                return new FileLogger($file);
    }));

    // [...]

    // modify the logger service factory - make it shared.
    $container->extendService(LoggerInterface::class, new ClosureExtender(function(FactoryInterface $factory) {
        return new SharedFactory($factory);
    }));