zend-framework2 - 初始化程序无法识别类

标签 zend-framework2 initializer servicemanager

我对 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;
        },
    ),

现在我想将它注入(inject)到每个实现 LoggerAwareInterface 的类中。 所以在我的 Module.php 中,我的 getServiceConfig 函数中有这个初始化程序

        'initializers' => array(
                'logger' => function($service, $sm) {
                    if ($class instanceof LoggerAwareInterface) {
                        $logger = $sm->get('Zend\Log\Logger');
                        $class->setLogger($logger);
                    }
                }
        ),

给出的示例,我想将其注入(inject)名为 PartController 的类中,因此我将其设置为 module.config.php 中的可调用

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 部分?

提前感谢大家。

最佳答案

如果您希望初始化程序应用于 Controller ,您需要告诉 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);
                    }
                },
            ),
        );
    }

}

关于zend-framework2 - 初始化程序无法识别类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16377897/

相关文章:

php - 如何在 ZF2 中编写满足 GET 参数的路由?

php - Zend Framework 2 DateSelect/MonthSelect 格式化

java - static() 方法(没有任何声明)

objective-c - 通过提升的助手和 SMJobBless 获得根访问权限

android - 将供应商服务添加到 ServiceManager with android treble architecture[SELinux policy]

php - Acrobat Reader 在关闭时提示保存 pdf 文件(使用 TCPDF 创建)

ruby-on-rails-3 - YAML.load 永远不会在 Rails 初始值设定项中返回

c# - 对象初始化程序强制编译错误

Android MediaPlayer AudioStream AudioFlinger 服务器死了!,致命信号 11

php - ZF2 - 子查询