我目前正在学习/试验 ZF2 的稳定版本。最近几天一直在尝试找到解决我的问题的方法,即:我希望能够为一组控制器编写一些通用的设置逻辑。在采埃孚!然后,我将编写一个通用控制器并从中派生,使用 init() 方法作为我的设置逻辑。经过一番搜索,我发现 init() 方法已在 ZF2 中删除,并且有其他方法可以获得相同的功能。
我试图遵循 MW O'Phinney 的指南:http: //mwop.net/blog/2012-07-30-the-new-init.html
在我的情况下,我必须能够检索和检查我的设置逻辑的路由参数,因此覆盖替代方法的方法不起作用,因为此时无法访问 MvcEvent。所以,我尝试了 Update: serviceManager 解决方案,这就是我卡住的地方。首先,我只是尝试将指南中的代码复制到我的 Module 类中并回显一些文本以查看是否调用了回调。它不是。
在网上进行了更多搜索后,我找到了一个可能的解决方案;在通用控制器的构造函数中附加回调。同样的问题似乎也在这里。构造函数当然会被调用,但回调要么未附加或未正确触发(或根本没有)。
我将附上来自两种不同解决方案的一些代码:
在 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(通用控制器)中:
public function __construct() {
$this->getEventManager()->attach('dispatch', array($this, 'preDispatch'), 1000);
echo "construct";
}
public function preDispatch() {
echo "This is preDispatch()!";
}
有没有人可以帮助我解决这个问题,最终告诉我在这里误解了什么?任何帮助表示赞赏:)