PhalconPHP DI:初始值设定项

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 php,我正在寻找一种基于实现的接口自动注入某些类的方法

例如,如果一个类实现了
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获取它,如第一个选项所示