elazar/auryn-container-interop

Auryn的PSR-11容器兼容性

3.0.0 2018-07-01 14:38 UTC

This package is auto-updated.

Last update: 2024-08-29 04:14:35 UTC


README

Build Status

PSR-11兼容性Auryn

许可

此库根据MIT许可授权。

安装

使用composer

composer require elazar/auryn-container-interop

用法

use Elazar\Auryn\Container;
use Acme\SomeDependency;

$container = new Container;

if ($container->has(SomeDependency::class)) {
    // ...
}

$instance = $container->get(SomeDependency::class);

// All public methods of Auryn\Injector are available
$instance = $container->make(SomeDependency::class);

请确保您熟悉Auryn的工作原理。如作者建议,请避免将其用作服务定位器模式

实现

虽然我同意在此问题中关于为什么新项目可以直接使用Auryn而不需要PSR-11实现的许多讨论,但我确实认为这种实现对于将Auryn与使用PSR-11的第三方库集成是有用的,例如zend-expressive

此存储库中的实现从PSR-11规范第1.1.2节中的这段内容取得了一些自由

has ... 必须返回 true,如果容器知道条目标识符

Auryn使用完全限定名称来识别类和接口中的依赖关系,而大多数容器实现使用用户指定的名称。因此,即使Auryn不包含该类的定义,它也可以实例化一个类(例如,如果类没有必需的构造函数参数,或者这些参数本身就是可实例化的类)。

因此,在这个PSR-11实现中,ContainerInterface->has()将返回true,如果底层的Auryn\Injector实例定义了一个请求的类或接口,或者如果请求的类已定义且被视为可实例化(即不是abstract并且有一个public实现的__construct())。尽管有些人可能认为这是技术上的错误,但这似乎与PSR-11标准的整体精神和意图是一致的。

开发

要运行PHPUnit测试套件

composer run-script test