新しいコントローラーに別のレイアウトを設定したいのですが、コントローラー全体に設定するのに理想的な場所について提案をお願いします。今、私は$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すると、モジュールが残りを処理します。