PhalconPHP DI:初始值设定项
我目前正在为一个项目测试phalcon php,我正在寻找一种基于实现的接口自动注入某些类的方法 例如,如果一个类实现了PhalconPHP DI:初始值设定项,php,dependency-injection,phalcon,Php,Dependency Injection,Phalcon,我目前正在为一个项目测试phalcon php,我正在寻找一种基于实现的接口自动注入某些类的方法 例如,如果一个类实现了Phalcon\DI\injectionawareiinterface,它将自动将DI注入该类 我想做的是类似的。如果一个类有例如Aranea\Db\dbadapterware,它应该自动将DbAdapter注入该类中。我正在寻找类似Zend Framework 2()的功能,在DI配置过程中,您可以指定如下初始值设定项: 'initializers' => array(
Phalcon\DI\injectionawareiinterface
,它将自动将DI注入该类
我想做的是类似的。如果一个类有例如Aranea\Db\dbadapterware
,它应该自动将DbAdapter注入该类中。我正在寻找类似Zend Framework 2()的功能,在DI配置过程中,您可以指定如下初始值设定项:
'initializers' => array(
'logger' => function($service, $sm) {
if ($service instanceof LoggerAwareInterface) {
$logger = $sm->get('logger');
$service->setLogger($logger);
}
}
),
如果这在PhalconPHP中不能自动实现,我想重写FactoryDefault
类并自己实现它。什么是注入这种逻辑的正确位置?是在get*方法中,还是在set*方法中?我假设一个方法在DI初始化期间并没有初始化,而是在第一次调用时初始化,所以get*听起来更合适吗
谢谢你的建议
杰罗恩
依赖项注入引用有一个例子,如果一个类实现了Phalcon\DI\InjectionAwareInterface
,它将自动将DI注入该类
这并不是完全正确的,它意味着当服务被解析时DI(自动)被注入,因为它实现了这个接口,DI不会神奇地出现在那里,仅仅因为类实现了一些接口
如果一个类有例如Aranea\Db\dbadapterware
,它应该自动将DbAdapter注入该类中
如果您的类扩展了Phalcon\DI\Injectable
(或者以与Phalcon\DI\Injectable
相同的方式实现injectionWareInterface
),那么它就是这样工作的(技术上不是这样)。在Injectable
内部有一个\uu get
魔术,如果服务存在,它会从DI返回服务。换句话说,只在DI中注入内容,其他类在DI中查找服务
要注入您自己的服务,您可以在配置中将它们传递给DI,或者扩展DI
或FactoryDefault
。两者之间的区别在于,FactoryDefault
已经预先配置了有用的服务,但您可能不需要这些服务
我假设一个方法在DI初始化期间并没有初始化,而是在第一次调用时初始化,所以get*听起来更合适吗
是的,有一个Phalcon\DI\Service
对象,它表示服务,并在第一次调用(如果是共享服务)或每次解析(如果不是)时解析。您通常希望共享所有服务,否则这通常会成为瓶颈,例如,在解析非共享数据库适配器时,它会在您每次调用它时建立连接
PS:注意,要让它在DbAdapter中按您的意愿工作,您可以做以下几件事:
添加适配器getter并返回DI::getDefault()->getShared('db')
李>
扩展Phalcon\DI\Injectable
并在创建类时设置DI,以便它可以查找服务
每次需要适配器时,只需从DI获取它,如第一个选项所示