gpt4 book ai didi

zend-framework2 - Zend 框架 2 : Cannot attach to 'dispatch' event

转载 作者:行者123 更新时间:2023-12-04 05:30:11 25 4
gpt4 key购买 nike

我目前正在学习/试验 ZF2 的稳定版本。最近几天一直试图找到我的问题的解决方案,即:我希望能够为一组 Controller 编写一些通用的设置逻辑。在采埃孚!然后我将编写一个通用 Controller 并从中派生,使用 init() 方法作为我的设置逻辑。经过一番搜索,我发现 init() 方法在 ZF2 中被删除了,并且有其他方法可以获得相同的功能。

我试图遵循 M. W. O'Phinney 的指南:http://mwop.net/blog/2012-07-30-the-new-init.html

在我的情况下,我必须能够检索和检查我的设置逻辑的路由参数,因此由于当时无法访问 MvcEvent,覆盖替代方法的方法不起作用。所以,我尝试了 Update: serviceManager 解决方案,这就是我卡住的地方。首先,我只是尝试将指南中的代码复制到我的 Module 类中并回显一些文本以查看是否完全调用了回调。它不是。

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

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

在 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(通用 Controller )中:
public function __construct() {
$this->getEventManager()->attach('dispatch', array($this, 'preDispatch'), 1000);
echo "construct";
}

public function preDispatch() {
echo "This is preDispatch()!";
}

有没有人可以帮助我解决这个问题,最终告诉我在这里误解了什么?任何帮助表示赞赏:)

最佳答案

您不能附加到工厂的发货,因为工厂在处理发货后很长时间才被调用。

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

public function onBootstrap($e)
{
...
$eventManager = $e->getApplication()->getEventManager();
$eventManager->attach("dispatch", function($e) {
echo "Dispatch!";
});
}

或者,您也可以从特定 Controller 执行此操作。不是在构造函数中,而是通过覆盖 setEventManager:
public function setEventManager(EventManagerInterface $events) {
parent::setEventManager($events);
$controller = $this;
$events->attach("dispatch", function($e) use ($controller) {
echo "Dispatch!";
});
}

希望这有帮助!

关于zend-framework2 - Zend 框架 2 : Cannot attach to 'dispatch' event,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12726134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com