2012-12-31 50 views

回答

3

控制器动作被调用时,每个控制器都会触发事件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的数组,然后该模块处理剩下的部分。

+0

在这里尝试了一吨的例子,这是唯一的工作。最简单的解决方法,谢谢 –