northwoods/container

Auryn 依赖注入器的容器包装器

3.2.0 2018-09-20 13:55 UTC

This package is auto-updated.

Last update: 2024-09-21 03:21:29 UTC


README

Become a Supporter Latest Stable Version License Build Status Code Coverage Scrutinizer Code Quality

Auryn 很棒,那么当包需要它时,为什么不使用它作为容器呢?

注意: 这与不使用 Auryn 作为服务定位器的理念完全相反。此包仅适用于希望使用需要服务定位器的包的 Auryn 用户。

尝试遵守 PSR-1PSR-2PSR-4PSR-11 标准。

安装

composer require northwoods/container

使用

use Auryn\Injector;
use Northwoods\Container\InjectorContainer;
use Psr\Container\ContainerInterface;

// Make an Injector and configure it.
$injector = new Injector();

// Optional: Declare a single container instance.
$injector->share(ContainerInterface::class);

// Use InjectorContainer as the implementation of ContainerInterface.
$injector->alias(ContainerInterface::class, InjectorContainer::class);

// InjectorContainer will wrap this Injector instance.
$injector->define(InjectorContainer::class, [':injector' => $injector]);

配置

此包提供了一个 InjectorBuilder,可用于使用独立的类配置 Auryn。构建器接受一个配置对象列表,并将每个配置应用于注入器。

use Northwoods\Container\Config\ContainerConfig;
use Northwoods\Container\InjectorBuilder;

$builder = new InjectorBuilder([
    new ContainerConfig(),
]);

如果您希望注入器实例化配置类,请使用 LazyInjectorBuilder

use Northwoods\Container\Config\ContainerConfig;
use Northwoods\Container\LazyInjectorBuilder;

$builder = new LazyInjectorBuilder([
    ContainerConfig::class,
]);

然后可以使用构建器创建一个 Injector 实例

$injector = $builder->build();
$container = $injector->make(ContainerInterface::class);

注意: 也可以将现有的 Auryn 实例提供给 build() 方法。

Zend Service Manager 兼容性

此包与 Zend Expressive 容器配置 兼容

use Northwoods\Container\Zend\Config;
use Northwoods\Container\Zend\ContainerFactory;

$factory = new ContainerFactory();

$container = $factory(new Config(
    require 'path/to/services.php',
));

注意: 以这种方式配置的所有注入都将被共享!

也可以将现有的 Injector 传递给 ContainerFactory

$factory = new ContainerFactory($injector);

这可以与 InjectorBuilderLazyInjectorBuilder 结合使用,以应用配置,如 define() 调用。

标识符

PSR-11 不要求容器标识符必须是类名,而 Auryn 则要求。Auryn 中此规则的唯一例外是 类别名 可以是任何内容。这些容器 "服务名称" 必须解析为类,并将需要被别名化。

例如,一个包可能需要在容器中有一个 config 条目,该条目旨在解析为数组。这可以通过创建一个创建 ArrayObject 实例的代理来实现

use ArrayObject;
use Auryn\Injector;
use Northwoods\Container\InjectorContainer;

// Share a global "config" array as an object
$injector->share('config')->delegate('config', function () {
    return new ArrayObject(require 'path/to/config.php');
});

// Create the container
$container = new InjectorContainer($injector);

现在每当调用 $container->get('config') 时,都会返回 ArrayObject

示例

更多示例可在 examples/ 目录中找到。

许可证

MIT