Zend framework2 Zend Framework 2:无法附加到';调度';事件

Zend framework2 Zend Framework 2:无法附加到';调度';事件,zend-framework2,Zend Framework2,我目前正在学习/试验ZF2的稳定版本。过去几天一直在试图找到解决我问题的方法,那就是:我希望能够为一组控制器编写一些设置逻辑。在ZF!然后,我只需编写一个通用控制器并从中派生,使用init()方法进行设置逻辑。经过一点搜索,我发现在ZF2中删除了init()方法,并且有其他方法可以获得相同的功能 我试着按照M.W.O'Phinney的指导: 在我的例子中,我必须能够检索并检查设置逻辑的路由参数,因此覆盖备选方案的方法不起作用,因为此时无法访问MvcEvent。因此,我尝试了更新:serviceM

我目前正在学习/试验ZF2的稳定版本。过去几天一直在试图找到解决我问题的方法,那就是:我希望能够为一组控制器编写一些设置逻辑。在ZF!然后,我只需编写一个通用控制器并从中派生,使用init()方法进行设置逻辑。经过一点搜索,我发现在ZF2中删除了init()方法,并且有其他方法可以获得相同的功能

我试着按照M.W.O'Phinney的指导:

在我的例子中,我必须能够检索并检查设置逻辑的路由参数,因此覆盖备选方案的方法不起作用,因为此时无法访问MvcEvent。因此,我尝试了更新:serviceManager解决方案,这就是我遇到的问题。首先,我尝试将指南中的代码复制到我的模块类中,并回显一些文本,以查看是否调用了回调。但事实并非如此

在网上进行了更多的搜索之后,我找到了一个可能的解决方案;在通用控制器的构造函数中附加回调。同样的问题也出现在这里。当然会调用构造函数,但回调要么没有附加,要么没有正确触发(或者根本没有)

我将附上两种不同解决方案中的一些代码:

在Module.php中:

public function getControllerConfig() {
    return array(
        'factories' => array(
            'Game\Controller\Mapsquare' => function($controllers) {
                $serviceManager = $controllers->getServiceLocator();
                $eventManager = $serviceManager->get('EventManager');
                $controller = new Controller\MapsquareController();

                echo "this text is echoed";

                $eventManager->attach('dispatch', function ($e) use ($controller) {
                    echo "this text is NOT echoed";
                    $request = $e->getRequest();
                    $method  = $request->getMethod();
                    if (!in_array($method, array('PUT', 'DELETE', 'PATCH'))) {
                        // nothing to do
                        return;
                    }

                    if ($controller->params()->fromRoute('id', false)) {
                        // nothing to do
                        return;
                    }

                    // Missing identifier! Redirect.
                    return $controller->redirect()->toRoute(/* ... */);
                }, 100); // execute before executing action logic

                $controller->setEventManager($eventManager);

                return $controller;
            }
        )
    );
}
在MapsquareController.php(通用控制器)中:


有没有人能帮我解决这个问题,最终说出我在这里误解了什么?非常感谢您的帮助:)

Evan Coury关于Zend Framework 2中模块特定布局的帖子似乎给出了一个解决方案,它对我很有用


您无法附加到工厂发货,因为在处理发货后很长时间才会调用工厂

要使其工作,请打开Module.php并编辑onBootstrap(),以便连接到那里。 例如:

public function onBootstrap($e)
{
    ...
    $eventManager = $e->getApplication()->getEventManager();
    $eventManager->attach("dispatch", function($e) {
        echo "Dispatch!";
    });
}
或者,也可以从特定控制器执行此操作。不是在构造函数中,而是通过重写setEventManager:

public function setEventManager(EventManagerInterface $events) {
    parent::setEventManager($events);
    $controller = $this;
    $events->attach("dispatch", function($e) use ($controller) {
        echo "Dispatch!";
    });
}

希望这有帮助

请注意,接受的数据不正确。OP发布的代码根本不起作用。永远不要用横切的关注点来争论你的onBootstrap。原因如下:

public function __construct() {
    $this->getEventManager()->attach('dispatch', array($this, 'preDispatch'), 1000);
    echo "construct";
}
之所以不起作用,是因为事件管理器在构建后被连接,并在调度时开火

关于“工厂在发货后很长一段时间内被称为工厂”的评论也毫无意义。你知道工厂做什么吗

“O'phinney先生”的建议是正确的方式,也许下次在你决定像Matthew这样的人让你失望之前,可以更好地阅读手册


解决方案如下:

您好,谢谢您的回复!是的,我还成功地使用Coury的解决方案更改了模块的特定布局。然而,我还不能使用相同的解决方案来解决初始化控制器的问题。嗨,谢谢你的回复!setEventManager方法的工作方式很有魅力:)然而,我必须说,我有点失望,奥芬尼先生自己建议在getcontrollerConfig()中附加调度挂钩,而这显然不起作用。好吧,再次感谢你的回答:)你访问过链接吗?我的getControllerConfig方法是O'Phinney在网站上发布的内容的真实副本。为什么你不带着你那善良的头脑中的一些建设性的帮助而来,而不是谈论我严肃的问题呢?当然,我访问了你的链接,我转发了它,因为这个问题给人的印象是解决方案是假的。这是一个真实的副本,但您尝试执行的操作不起作用,这与您复制粘贴的代码无关。我也告诉过你为什么,所以在称之为非建设性之前,也许再看看我给你的反馈,因为它非常有建设性,再没有比这更具建设性的了。你可能会很恼火,但别忘了你忽视了那些可能让你目前的工作陷入困境的人。作为一个不断做出贡献的人,读这样的东西让人筋疲力尽。你在上面的帖子中提到的代码与我发布的问题无关。顺便说一句,如果你是这样回答问题的,我强烈建议你停止“贡献”。因为,你看,这让人很生气。没人让你读我的“精疲力竭的东西”。所以你还是不明白,还是回到乐高或者别的什么吧。“顺便说一句”,我强烈建议你不要再问问题了,如果你想事先侮辱别人,而《fking duplo手册》是你最后读的东西。
public function __construct() {
    $this->getEventManager()->attach('dispatch', array($this, 'preDispatch'), 1000);
    echo "construct";
}