从Module.php获取控制器名称

时间:2013-08-16 11:50:50

标签: zend-framework2

我已设法订阅我的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);

我需要调用控制器名称?我的意思不是课程,而是说,如果我的控制器课程Application\Controller\MyController,我希望收到my-controller,就像在网址中找到的那样。我也不想在URL本身上进行字符串匹配,因为我可能不想依赖它,因为可能会有更复杂的路由。

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

2 个答案:

答案 0 :(得分:2)

您可以从调度侦听器中的MvcEvent中提供的routematch获取该信息。

public function onDispatch(\Zend\Mvc\MvcEvent $e)
{
    $routeMatch = $e->getRouteMatch();
    $controller = $routeMatch->getParam('controller');
    $action = $routeMatch->getParam('action');
}

答案 1 :(得分:0)

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

问题是,原始的controller参数被前置命名空间覆盖,大写控制器名称,破坏驼峰等等。这可以在\Zend\Mvc\ModuleRouteListener方法末尾的onRoute()中找到。

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

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

public function onDispatch(\Zend\Mvc\MvcEvent $e)
{
    $routeMatch = $e->getRouteMatch();
    $controllerParamName = \Zend\Mvc\ModuleRouteListener::ORIGINAL_CONTROLLER;
    $controller = $routeMatch->getParam($controllerParamName); // my-controller
}