m0rtis/simple-box

简单PSR-11容器,可选自动装配

1.0.0 2018-06-18 17:42 UTC

This package is auto-updated.

Last update: 2024-09-19 09:39:55 UTC


README

pipeline status coverage report

简单且轻量级的PSR-11依赖注入容器,可选自动装配。此包仅包含4个文件,其中2个实现了PSR-11所需的异常接口。

安装

最佳方式是通过 composer 安装此包。

composer require m0rtis/simplebox

使用方法

基础

如果您不需要自动装配,应使用您的应用程序中的 m0rtis\SimpleBox\Container 类。

use m0rtis\SimpleBox\Container

$container = new Container([$arrayOrIteratorWithYourData]);

但如果您想使用自动装配,请随意实例化扩展基本容器类的 m0rtis\SimpleBox\AutowiringContainer 类。

use m0rtis\SimpleBox\AutowiringContainer

$container = new AutowiringContainer([$arrayOrIteratorWithYourData]);

如果您使用的是自动装配容器,您可以获取任何现有的(class_exists === true)类,即使您之前没有将其放入容器中!只需按类名请求它,AutowiringContainer 将尝试为您创建一个实例。我们建议您使用PSR-11 has 方法检查容器是否可以为您创建对象。

if ($autowiringContainer->has(RequiredClass::class) {
    $object = $autowiringContainer->get(RequiredClass::class);
}

请注意,SimpleBox 容器实现了 ArrayAccess 接口。这意味着您可以将 SimpleBox 容器用作数组。

if (isset($autowiringContainer[RequiredClass::class])) {
    $object = $autowiringContainer[RequiredClass::class];
}

配置

SimpleBox 中没有任何单独的存储空间用于配置。SimpleBox 容器通过项目ID config 查找配置。此项目应是一个数组或可迭代的对象。与特定类相关的配置必须放置在该类的名称或其实现的接口之一的键下。例如,我们有一个类

class SomeAwesomeClass implements AwesomeInterface
{
    private $config;
    
    public function __construct (iterable $config)
    {
        $this->config = $config;
    }
}

如你所见,它需要一些配置才能实例化(参数名称必须是 config)。因此,您应该这样放置配置

$container = new AutowiringContainer([
    'config' => [
        SomeAwesomeClass::class => [
            'configKey' => 'configValue'
        ]
    ]
]);

或这样

$container = new AutowiringContainer([
    'config' => [
        AwesomeInterface::class => [
            'configKey' => 'configValue'
        ]
    ]
]);

在两种情况下,当您从自动装配容器中查询 SomeAwesomeClass 时,请求的类将使用其自己的配置进行实例化。

$config = ['configKey => 'configValue']

SimpleBox 容器现在只有一个配置选项 - return_shared

这是一个标志,表示容器是否将返回与相同查询相同的对象或每次都创建一个新对象。默认行为是返回相同的对象。您可以在我们的 测试 中查看示例。

$result1 = $container->get(DependencyTwo::class);
$result2 = $container->get(DependencyTwo::class);

$this->assertSame($result1, $result2);

如果您想更改默认行为,需要将具有以下结构的数组或另一个 iterable 传递给容器的构造函数。

[
    'config' => [
        'Psr\Container\ContainerInterface::class' => [
            'return_shared' => false
        ]
    ]
]

您还可以使用 m0rtis\SimpleBox\Container::create(string $id) 方法获取与之前查询不同的新对象。

如何定义服务

您可以使用几种不同的方式在容器中定义您的服务

  • 接收容器作为参数并返回初始化服务的回调函数(Pimple方式)

    $container['serviceName'] = function (ContainerInterface $c) {
         return new AwesomeService($c->get('AwesomeServiceDependency'));
    };
    
  • 工厂类名称。工厂应该是可调用的(实现 __invoke 魔法方法),其名称中包含“factory”一词,并且不应有任何依赖。__invoke 方法应仅接受一个 Psr\Container\ContainerInterface 作为参数

    $container['serviceName'] = ServiceFactory::class;
    class ServiceFactory
    {
      public function __invoke(ContainerInterface $c)
      {
          return new AwesomeService($c->get('AwesomeServiceDependency'));
      }
    }
    
  • 任何 可调用 项。包括作为 字符串 的静态方法名称。

注意:异常是名称中不包含“factory”一词的可调用类(实现 __invoke 魔法方法)。此类也是可调用的,但 SimpleBox 容器不会调用它们,而是原样返回。例如

$service = $container->get(SomeInvokableClass::class); //$service instanceof SomeInvokableClass

$service = $container->get(ServiceFactory::class): //$service is the result returned by ServiceFactory::__invoke method

自动装配

本节README正在建设中。但您可以将测试视为一个简单示例。当然,您始终可以在问题页面或通过电子邮件向我提问。

版本控制

我们使用SemVer进行版本控制。有关可用的版本,请参阅此存储库的标签

作者

安东·弗米切夫(Anton Fomichev)别名m0rtis - [email protected]

许可证

本项目采用Apache 2.0许可证 - 详细信息请参阅LICENSE文件