Zend framework2 Zend Framework 2从布局中获取控制器名称

Zend framework2 Zend Framework 2从布局中获取控制器名称,zend-framework2,Zend Framework2,我有以下到不同控制器和操作的路线,它们都显示相同的布局和不同的视图,例如: http://<my domain>/controllername1/action1 http://<my domain>/controllername1/ http://<my domain>/controllername2/action1 http://<my domain>/controllername3/action1 然后从布局代码中使用它,如下所示: ec

我有以下到不同控制器和操作的路线,它们都显示相同的布局和不同的视图,例如:

http://<my domain>/controllername1/action1 
http://<my domain>/controllername1/ 
http://<my domain>/controllername2/action1
http://<my domain>/controllername3/action1
然后从布局代码中使用它,如下所示:

echo $this->layout()->controllerName;
第一个问题是,应使用ZF2函数获取控制器名称,将以下代码替换为更“漂亮”的代码:

(...)
// Parsing URI to get controller name
$viewModel->controllerName = trim($_SERVER['REQUEST_URI'],'/');
if (substr_count($viewModel->controllerName, '/')) {
    $viewModel->controllerName = substr($viewModel->controllerName, 0, strpos($viewModel->controllerName, '/'));
}
我希望避免从所有控制器/操作中注入控制器名称:这可以通过使用Module.php解决,但可能是一种更直接的方法


谢谢

您正在查找此链接:

否则,您会在此处遇到相同的问题(和答案):

MvcEvent–从布局中获取命名空间


我没有测试,但它似乎是正确的:

我知道这是一个老问题,但这里有一个简单的答案需要注意:

$this->getHelperPluginManager()->getServiceLocator()->get('Application')->getMvcEvent()->getRouteMatch()->getParam('action')
在这种情况下,这将返回任何路由参数“action”。
此代码可在视图或布局中使用。

此想法的可能重复之处是从布局代码中获取控制器名称,而不是从控制器代码中传递。也许不可能?这些答案适用于ZendFramework的旧版本,现在可能是一种更直接的方式。这种想法显然违反了MVP/MVC模式。理想情况下,视图应该对控制器一无所知。如果没有控制器怎么办?i、 e.在测试环境中。这意味着我应该始终传递控制器名称,更一般地说,我希望布局知道的“节”名称?如果您在视图中需要它,那么是的。当然,您不必在每次操作中都传递此值。可以在呈现事件上附加处理程序。它每次都会这样做。嗨,谢谢,这个想法是从布局代码中获取控制器名称,而不是从控制器代码中传递。也许不可能?这些答案适用于ZendFramework的旧版本,现在可能是一种更直接的方法。
$this->getEvent()->getRouteMatch()->getParam('action', 'index'); 
$this->getEvent()->getRouteMatch()->getParam('controller', 'index');
$this->getHelperPluginManager()->getServiceLocator()->get('Application')->getMvcEvent()->getRouteMatch()->getParam('action')