6.3. Inject on an existing instance
在现有实例上注入
PHP-DI 3.3中引入的功能
使用容器的标准方法是从容器中获取对象,并注入其所有依赖项:
$object = $container->get('foo');
但是在某些情况下,您无法控制对象的创建,但是您仍想解决其依赖项。
PHP-DI提供了injectOn
方法:
// $object 是某个类的实例
$container->injectOn($object);
现在,$ object
注入了其所有依赖项(通过setter注入和属性注入)。
构造函数注入
PHP-DI将不执行任何构造函数注入(因为实例已创建)。
如果您自己创建对象,则必须自己进行构造函数注入:
$object = new MyClass($someDependency, $someOtherDependency);
$container->injectOn($object);
如果从某个库/框架中获取对象,则只需调用injectOn()
为什么?
因为我们希望这可以帮助将PHP-DI与其他框架集成:
- MVC 框架 (Symfony, Zend Framework等): 在控制器本身中注入控制器的依赖项。
- Tests (PHPUnit, …): 在测试类中注入工具,例如logger,timer(用于性能测试),实体管理器(用于集成测试)等
示例:
class MyController {
public function __construct() {
// 获取容器...
$container->injectOn($this);
}
}
当然,首选方法仍然是使用$ container-> get()
。但是有时您无法在框架的内部来拦截对象的创建。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。