【问题标题】:Zend Framework 2 Get controller name from layoutZend Framework 2 从布局中获取控制器名称
【发布时间】:2014-03-27 18:18:02
【问题描述】:

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

http://<my domain>/controllername1/action1 
http://<my domain>/controllername1/ 
http://<my domain>/controllername2/action1
http://<my domain>/controllername3/action1

如何在布局代码中获取加载布局的控制器名称?返回:“controllername1”、“controllername2”或“控制器名称3"

目标是确定我在网站的哪个部分,并在布局上进行一些自定义。

我检查了类似的回复,但都是针对旧版本的 Zend Framework。

说明: 这个想法是从布局代码中获取控制器名称,而不是从控制器代码中传递它。也许不可能?其他答案适用于 ZendFramework 的旧版本(测试版),现在可能是一种更直接的方法。

已编辑:更多信息

我可以在我的 Module.php 文件中设置 onBootstrap($e) 上的以下代码:

public function onBootstrap($e)
{
    // (...) Other code

    $application = $e->getParam('application');
    $viewModel = $application->getMvcEvent()->getViewModel();

    // 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, '/'));
     }
 }

然后从布局代码中使用如下:

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 解决,但可能是更直接的方法。

谢谢!

【问题讨论】:

  • 这个想法是从布局代码中获取控制器名称,而不是从控制器代码中传递它。也许不可能?这些答案适用于旧版本的 ZendFramework,现在可能是一种更直接的方法。
  • 这个想法明显违反了MVP/MVC模式。理想情况下,View 应该对控制器一无所知。如果没有控制器怎么办?即在测试环境中。
  • 意味着我应该始终传递控制器名称,更一般地说是我希望布局知道的“部分”名称?
  • 如果您在视图中需要这个,那么可以。当然,您不必在每个操作中都传递此值。您可以在渲染事件上附加一个处理程序。它每次都会为您执行此操作。

标签: zend-framework2


【解决方案1】:

您正在寻找此链接:How to get the controller name, action name in Zend Framework 2

$this->getEvent()->getRouteMatch()->getParam('action', 'index'); 
$this->getEvent()->getRouteMatch()->getParam('controller', 'index');

否则你有同样的问题(和答案)在这里:ZF2 - Get controller name into layout/views

MvcEvent – 从布局中获取 NAMESPACE / 模块名称 http://samsonasik.wordpress.com/2012/07/27/zend-framework-2-mvcevent-layout-view-get-namespace/

我没有测试,但它似乎是正确的:http://pastebin.com/HXbVRwTi

【讨论】:

  • 嗨,谢谢,我们的想法是从布局代码中获取控制器名称,而不是从控制器代码中传递它。也许不可能?这些答案适用于旧版本的 ZendFramework,现在可能是一种更直接的方法。
【解决方案2】:

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

$this->getHelperPluginManager()->getServiceLocator()->get('Application')->getMvcEvent()->getRouteMatch()->getParam('action')

这将返回任何路由参数,在这种情况下为“动作”。 此代码可用于视图或布局中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    相关资源
    最近更新 更多