buffalokiwi / buffalotools_ioc
PHP 8 的 IOC / 服务定位器
v1.0.12
2021-08-20 22:40 UTC
Requires
- php: ^8.0
Requires (Dev)
- phpunit/php-invoker: ^2.0
- phpunit/phpunit: ^8
README
一个快速、简单、直接的 PHP 7.4 反转控制/服务定位器库。
MIT 许可证
安装
composer require buffalokiwi/buffalotools_ioc
基础知识
此容器将维护任何已注册服务的单个引用。
- 通过调用 addInterface() 注册服务。提供的闭包包含调用 new class() 的调用。
- 按需实例化服务,除非调用 newInstance(),否则不会创建任何实例。
- 调用 getIntance() 将调用 newInstance() 一次并缓存结果。
- 后续对 getIntance() 的调用将返回缓存的实例。
- 此容器不打算传递给各种类。
- 所有服务应在单个位置(组合根)注册,并应通过某些路由器自动注入到构造函数中。
- 在构建容器时,指定严格模式将测试提供给 addInstance() 的闭包返回的实例是否与调用 newInstance() 时提供的接口匹配。
示例
//..Create the IOC container $ioc = new IOC(); //..Add some interface to the container, and supply a factory for creating new instances $ioc->addInterface( \namespace\to\SomeAmazingClass::class, function() { return new SomeAmazingClass(); }); //..Retrieve the class instance by supplying the same interface or class name as supplied to addInterface() $amazing = $ioc->getInstance( \namespace\to\SomeAmazingClass::class );
注意:使用 ::class 后缀是到完全命名空间类名的快捷方式,并且不会触发自动加载器。
注意 2:在将对象注册到容器时,不要添加 "use" 语句。这将会触发自动加载器。
始终使用完全命名空间的类或接口名称(最好是接口)。
自动装配方法
容器包含一个 autowire() 方法。这将尝试自动确定某些类构造函数的值。可以将变量作为命名映射传递到 arg#2 作为参数。
参数映射器
可以将 IArgumentMapper 的实例提供给 IOC 类的构造函数。当调用 autowire() 时,首先检查是否存在与提供给 autowire() 的类/接口名称匹配的映射器。如果找到,则将映射器中包含的参数与提供给 autowire() 的 $args 数组合并,$args 优先。这可以用来将某些配置元素移动到不同的位置。