我已设法订阅我的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本身上进行字符串匹配,因为我可能不想依赖它,因为可能会有更复杂的路由。
另外,如果您知道,请告诉我如何获取操作名称。
答案 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
}