【问题标题】:Class not recognized by initializer初始化程序无法识别的类
【发布时间】:2013-05-04 19:02:14
【问题描述】:

我对 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 中将它设置为可调用

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

提前感谢大家。

【问题讨论】:

    标签: zend-framework2 initializer servicemanager


    【解决方案1】:

    如果你想让你的初始化器应用于控制器,你需要告诉ControllerManager,你可以通过实现Zend\ModuleManager\Feature\ControllerProviderInterface定义的getControllerConfig方法来做到这一点,即,

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

    【讨论】:

    • 感谢 Crisp,但还没有完全解决。现在 serviceManager 抛出异常: Zend\ServiceManager\ServiceManager::get 无法获取或创建 Zend\Log\Logger 的实例。失败的行是: $logger = $sm->get('Zend\Log\Logger');
    • 啊,你需要调用getServiceLocator(),因为$sm是控制器管理器实例,见编辑
    • 完美,现在我在 PartController 中有我的记录器。我自己也猜到了,因为当我转储 sm 时,我看到记录器在 serviceLocator 中。真丢人。但是现在,您能否向我解释两件事,也许是在一个新的答案中: - 为什么我需要调用 getControllerConfig 而不是 getServiceConfig ? - 如何在任何模型、视图或任何其他实现 LoggerAwareInterface 的类中注入记录器?非常感谢!
    • 只是一个提示:总是命名你的初始化器。我记得一些 ZF-Folks 告诉我,未命名的东西有时会导致......有趣......:D
    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多