我对zf2很新,但我已经设置了一个使用它的网站。我对serviceManager有了一些了解,但现在我卡住了。
以下是上下文:我想在我的zf2应用程序的任何类上实现一个记录器。
在我的global.php中,我为记录器创建了工厂:
'service_manager' => array(
'factories' => array(
'Zend\Db\Adapter\Adapter'
=> 'Zend\Db\Adapter\AdapterServiceFactory',
'Zend\Log\Logger' => function($sm){
$logger = new Zend\Log\Logger;
$writer = new Zend\Log\Writer\Stream('./data/log/'.date('Y-m-d').'-error.log','wb');
$logger->addWriter($writer);
return $logger;
},
),
现在我想在每个实现LoggerAwareInterface的类中注入它。 所以在我的Module.php中,我在getServiceConfig函数中有了这个初始化器
'initializers' => array(
'logger' => function($service, $sm) {
if ($class instanceof LoggerAwareInterface) {
$logger = $sm->get('Zend\Log\Logger');
$class->setLogger($logger);
}
}
),
示例给出,我想将它注入一个名为PartController的类中,所以我将它设置为module.config.php中的invokable
return array(
'controllers' => array(
'invokables' => array(
'Part\Controller\Part' => 'Part\Controller\PartController',
),
),
该类正在实现LoggerAwareInterface
class PartController extends AbstractActionController implements LoggerAwareInterface
我遇到的问题是在PartController中没有初始化记录器,我在PartController中用var_dump检查过。
我试图转储初始化程序检查的所有服务,并且PartController没有出现......
我做错了什么?为什么PartController没有在serviceManager中注册,尽管它位于我的module.config.php的invokables部分?
提前感谢所有人。
答案 0 :(得分:3)
如果您希望初始化程序应用于控制器,您需要告诉ControllerManager
有关它,您可以通过实施getControllerConfig
定义的Zend\ModuleManager\Feature\ControllerProviderInterface
方法来实现,即。 ,
<?php
// ..some namespace
use Zend\ModuleManager\Feature\ControllerProviderInterface;
class Module implements ControllerProviderInterface
{
// ..
public function getControllerConfig()
{
return array(
'initializers' => array(
'LoggerAwareInitializer' => function($instance, $sm) {
if ($instance instanceof LoggerAwareInterface) {
$logger = $sm->getServiceLocator()->get('Zend\Log\Logger');
$instance->setLogger($logger);
}
},
),
);
}
}