0

我已经设法订阅了onDispatch()我的方法,Application\Module.php其中路由信息应该比onBootstrap().

public function onBootstrap(MvcEvent $e) {
    $em = $e->getApplication()->getEventManager(); 
    $em->attach(\Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'onDispatch'));
}

public function onDispatch(\Zend\Mvc\MvcEvent $e) {
    //$controllerName = /* ... ? */;
    $e->getViewModel()->setVariables(
        array('controllerName'=> $controllerName,
        'actionName' => $actionName)
    );
return parent::onDispatch($e);

我需要调用控制器名称吗?我的意思不是类,而是说,如果我的控制器类 if Application\Controller\MyController,我想接收my-controller在 URL 中可以找到的内容。我也不想对 URL 本身进行字符串匹配,因为我不想依赖它,因为路由可能更复杂。

另外,如果您知道,请告诉我如何获得动作名称。

4

2 回答 2

2

您可以从调度侦听器的 MvcEvent 中可用的路由匹配中获取该信息。

public function onDispatch(\Zend\Mvc\MvcEvent $e)
{
    $routeMatch = $e->getRouteMatch();
    $controller = $routeMatch->getParam('controller');
    $action = $routeMatch->getParam('action');
}
于 2013-08-16T17:00:10.890 回答
0

我终于找到了答案。答案与 Bram Gerritsen 所说的类似。

问题是,原始controller参数通过在前面加上命名空间、将控制器名称大写、用破折号分隔驼峰大小写等来覆盖。这可以在\Zend\Mvc\ModuleRouteListener接近onRoute()方法结束时找到。

可以看出,原始控制器参数保存在__CONTROLLER__参数下,或者使用常量\Zend\Mvc\ModuleRouteListener::ORIGINAL_CONTROLLER

所以最后,如果我当前的控制器是\Application\Controller\MyControllerController并且我希望检索原始控制器参数(比如my-controller,不是Application\Controller\MyController),我需要调用这个:

public function onDispatch(\Zend\Mvc\MvcEvent $e)
{
    $routeMatch = $e->getRouteMatch();
    $controllerParamName = \Zend\Mvc\ModuleRouteListener::ORIGINAL_CONTROLLER;
    $controller = $routeMatch->getParam($controllerParamName); // my-controller
}
于 2013-09-11T17:17:36.120 回答