【问题标题】:Zend Framework 2 - Get Controller and Action name in LayoutZend Framework 2 - 在布局中获取控制器和动作名称
【发布时间】:2013-01-12 01:15:36
【问题描述】:

我试图在布局文件中获取控制器名称和动作名称。但不能。在 ZF1 中,我们使用 Front Controller 实例来获取控制器和动作名称。我浏览了很多网站。但是没有解决办法。怎么进入ZF2?

【问题讨论】:

    标签: php zend-framework2


    【解决方案1】:

    控制器和它们的视图脚本是解耦的。事实上,一个请求可能涉及多个控制器。

    如果您想要将请求分派到的控制器和操作,您可以通过挂钩到分派事件来注入它们,并在附加的 ViewModel 中注入控制器和操作名称。

    一种方法是在 Bootstrap 事件中,它应该在 Module 类中。

    public function onBootstrap(\Zend\EventManager\EventInterface $e)
    {
        $app = $e->getApplication();
        $app->getEventManager()->attach(
            'dispatch',
            function($e) {
                $routeMatch = $e->getRouteMatch();
                $viewModel = $e->getViewModel();
                $viewModel->setVariable('controller', $routeMatch->getParam('controller'));
                $viewModel->setVariable('action', $routeMatch->getParam('action'));
            },
            -100
        );
    

    【讨论】:

    • 首先,谢谢。我检查过。但我收到以下错误。致命错误:在 /var/www/app/vendor/zendframework/zendframework/ 中未捕获异常 'Zend\ServiceManager\Exception\ServiceNotFoundException' 并带有消息 'Zend\ServiceManager\ServiceManager::get 无法获取或创建 modulename 的实例' library/Zend/ServiceManager/ServiceManager.php:452 堆栈跟踪:#0 /var/www/app/vendor/zendframework/zendframework/library/Zend/ServiceManager/AbstractPluginManager.php(110): Zend\ServiceManager\ServiceManager->get ('modulename', true)
    • 您是在要求 serviceManager 在某处获取服务“模块名称”吗?看起来它与您在这里要求的内容无关。
    • 感谢您的回复。 'modulename' 是我的模块。我在那个模块中使用了上面的代码。之后我收到上述错误。
    • -100 是什么意思?
    • 这是优先事项。 ZF2 的 DispatchListener 注册优先级为 1,因此任何注册了较高优先级的侦听器都会在 ZF2 的 DispatchListener 之前执行,较低的编号在之后执行。在这种情况下,这意味着该函数在请求被分派后执行,并且我们有一个准备好呈现的 ViewModel。事件队列使用SplPriorityQueue 实现
    【解决方案2】:

    我得到了上面的答案,但我不得不使用 sharedManager 将视图传递给控制器​​

        $app = $e->getApplication();
        $app->getEventManager()->getSharedManager()->attach(
            __NAMESPACE__,
            'dispatch',
            function($e) {
                $routeMatch = $e->getRouteMatch();
                $viewModel = $e->getViewModel();
                $viewModel->setVariable('controller', $routeMatch->getParam('controller'));
                $viewModel->setVariable('action', $routeMatch->getParam('action'));
                $controller = $e->getTarget();
                $controller->view = $viewModel;
            },
            100
        );
    

    如果我想按照我必须做的那样使用上述答案

        $this->getEvent('dispatch')->getViewModel()
    

    在控制器中

    【讨论】:

    • 谢谢,但是,我们必须将此代码放在我的操作中。 $this->getEvent('dispatch')->getViewModel()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多