从ZF2中的Doctrine2订阅服务器中检索请求的控制器/操作

时间:2016-03-07 18:57:46

标签: php doctrine-orm zend-framework2

我有许多实体包含许多不同的字段,但所有这些字段包括:IP,时间戳和'控制器/操作'。关联的表单为除这三个之外的所有实体属性提供字段。我宁愿不提供隐藏字段,而是在表单提交后填充这3个字段。

这就是为什么我创建了一个Doctrine Subscriber(根据here)并且正在听“onPersist'事件。我已成功设置IP和时间戳字段,并将其从订阅者中保存到我的数据库中。在请求的控制器中,我可以$this->params('controller');$this->params('action');来获取我需要的内容。但是,我在订阅者中检索所请求的Controller / Action时遇到了一些麻烦。

我已尝试在订阅者和订阅者工厂上根据here实施Zend\Mvc\InjectApplicationEventInterface,但我最终得到的是一个空的实例,而不是包含我需要的实际实例。我还尝试转储各种服务管理器的内容(IE:ControllerLoader,ControllerPluginManager和ViewHelperManager),但没有看到任何&Zever \ Mvc \ MvcEvent' Zend \ Mvc \ MvcEvent'

我有一个预感,我需要的是通过其中一个服务经理获得的。为了弄清楚如何检索Zend\Mvc\MvcEvent的现有实例,我应该查看什么?此外,我假设最好从我的订阅者工厂内检索它,如果这不是最好的方法,请纠正我。

1 个答案:

答案 0 :(得分:2)

您可以为您的Doctrine订阅者创建一个工厂,并从那里注入MvcEvent。您可以从整个应用程序生命周期内共享的Application对象中检索它。

<强>配置

'doctrine' => [
    'eventmanager' => [
        'orm_default' => [
            'subscribers' => [
                'MyModule\SomeListener',
             ]
         ]
     ]
]

<强>工厂

class SomeListenerFactory
{
    public function __invoke($serviceLocator)
    {
        return new SomeListener(
            $serviceLocator->get('Application')->getMvcEvent()    
        );
    }
}