【问题标题】:Ideal Location to Set default layout for Zend Framework 2 Controller?为 Zend Framework 2 控制器设置默认布局的理想位置?
【发布时间】:2012-12-15 08:35:31
【问题描述】:

我想为新的 Controller 设置不同的布局,请提供您的建议,以便在控制器上设置它的理想位置?现在我在每一个动作中都使用$this->layout()。 ZF1中曾经有preDispatch,不知道ZF2是怎么实现的。

【问题讨论】:

    标签: php layout controller zend-framework2


    【解决方案1】:

    当调用控制器动作时,每个控制器都会触发一个事件dispatch。此事件被封装在包含一些标识符的 EventManager 对象中。这使得SharedEventManager 可以在具有特定标识符的 EventManager 侦听特定事件。

    现在每个控制器(例如MyModule\Controller\FooController)都有两个已知标识符:

    1. 班级名称 (MyModule\Controller\FooController)
    2. 类的顶级命名空间 (MyModule)

    MyModule 的 Module.php 类是放置此逻辑的最佳位置。当应用程序启动时,您为该模块(即 Module.php 类的命名空间!)附加一个侦听器,用于调度事件。这样可以确保在调用控制器的操作时调用该函数,但在调度另一个控制器时不会执行侦听器。

    namespace MyModule;
    
    use Zend\Mvc\MvcEvent;
    
    class Module
    {
        public function onBootstrap($e)
        {
            $app = $e->getApplication();
            $em  = $app->getEventManager(); // Specific event manager from App
            $sem = $em->getSharedManager(); // The shared event manager
    
            $sem->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, function($e) {
                $controller = $e->getTarget(); // The controller which is dispatched
                $controller->layout('layout/my-module-layout');
            });
        }
    }
    

    blog post of mine 也解释了此方法(如何在特定模块中使用控制器进行操作)。因为模块特定的布局在 Zend Framework 2 中变得相当普遍,Evan Coury 为此制作了一个模块。它被称为EdpModuleLayout,安装模块后相当容易。

    您在配置中提供MyModule => layout/template 的数组,其余的由模块处理。

    【讨论】:

    • 在这里尝试了大量示例,这是唯一有效的示例。最简单的解决方案,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    相关资源
    最近更新 更多