Zend framework2 从模块转发到另一个控制器/操作

Zend framework2 从模块转发到另一个控制器/操作,zend-framework2,Zend Framework2,我试图找出在触发MvcEvent::EVENT_DISPATCH_错误时转发到另一个控制器/操作的最佳方式 到目前为止,我在模块的引导中了解到的是: $eventManager = $event->getApplication()->getEventManager(); $eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, function($e) { $routeMatch = new Router\RouteMatch(

我试图找出在触发MvcEvent::EVENT_DISPATCH_错误时转发到另一个控制器/操作的最佳方式

到目前为止,我在模块的引导中了解到的是:

$eventManager = $event->getApplication()->getEventManager();
$eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, function($e) {
$routeMatch = new Router\RouteMatch(array('controller'=>'my-controller','action'=>'my-action');
}, 100);
我的问题是:

  • 如何发送$routeMatch
  • 这样做对吗
  • 作为背景,我正在升级一个旧的ZF1应用程序,我使用前端插件来完成这项工作。这是一个cms应用程序,当找不到匹配的路由时,cms控制器用于将路由与db条目和返回页面匹配

    谢谢


    Adam

    当用户想要访问其角色不允许的操作时,我就是这样做的。使用params中的$e:

    $match = $e->getRouteMatch();
    $match->setParam('controller', 'User\Controller\Account');
    $match->setParam('action', 'denied');
    

    我希望这会有所帮助。

    您需要使用新路线重新发送活动

    创建新路线匹配后,添加以下内容:

    $newEvent = clone $e;
    $e->stopPropagation(TRUE);
    $newEvent->setRouteMatch($routeMatch);
    $eventManager->trigger('dispatch', $newEvent);
    

    感谢您抽出时间回答Conti。基本上你和我做的一样。但是,由于我在dispatch_error事件中执行此操作,仅设置routematch是不够的,因为“dispatch”基本上已经发生,并且确定没有匹配的路由。因此,为什么我要重置路线。。。我只是不知道如何重新发送。我很高兴其他解决方案解决了您的问题,我也在考虑在我的应用程序中测试它,尽管我的代码可以工作:)。谢谢。我现在有一个不同的问题:)但是这个有效:)你介意看看哪一个是我的新问题吗。。与此非常相关。