新しいコントローラーに別のレイアウトを設定したいのですが、コントローラー全体に設定するのに理想的な場所について提案をお願いします。今、私は$this->layout()
これまでのすべてのアクションで使用しています。ZF1には以前ありましたがpreDispatch
、ZF2でどのように実装されているかはわかりません。
1 に答える
dispatch
コントローラー アクションが呼び出されると、すべてのコントローラーがイベントをトリガーします。このイベントは、EventManager
いくつかの識別子を含むオブジェクト内にカプセル化されています。これにより、特定の識別子を持つ EventManager内SharedEventManager
の特定のイベントをリッスンできます。
これで、すべてのコントローラー ( などMyModule\Controller\FooController
) には 2 つの既知の識別子があります。
- クラスの名前 (
MyModule\Controller\FooController
) - クラスの最上位の名前空間 (
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');
});
}
}
この方法 (特定のモジュール内でコントローラーを操作する方法) は、私のブログ投稿でも説明されています。Zend Framework 2 ではモジュール固有のレイアウトが非常に一般的になるため、Evan Coury はこのためのモジュールを作成しました。これはEdpModuleLayoutと呼ばれ、モジュールをインストールすると非常に簡単です。
MyModule
構成で=>の配列を指定layout/template
すると、モジュールが残りを処理します。