elazar / auryn-container-interop
Auryn的PSR-11容器兼容性
3.0.0
2018-07-01 14:38 UTC
Requires
- psr/container: ^1.0
- rdlowrey/auryn: ^1.4
Requires (Dev)
- phpunit/phpunit: ^5
This package is auto-updated.
Last update: 2024-08-29 04:14:35 UTC
README
许可
此库根据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