2012-12-31 52 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

在這裏嘗試了一噸的例子,這是唯一的工作。最簡單的解決方法,謝謝 –