设置Zend Framework 2 Controller默认布局的理想位置?

时间:2012-12-31 04:01:36

标签: php layout controller zend-framework2

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

1 个答案:

答案 0 :(得分:3)

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

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

  1. 班级名称(MyModule\Controller\FooController
  2. 类的顶级命名空间(MyModule
  3. 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,模块处理其余部分。