Zend Framework MVCアプリケーションを構築していますが、Zend_Layoutを構成するのが困難です。
まず、私のアプリケーションリソースはすべて、次のコードでブートストラップにロードされるリソースプラグインにあります。
protected function _initResourcePlugins() {
$this->registerPluginResource('Log');
$this->registerPluginResource('Router');
$this->registerPluginResource('Db');
$this->registerPluginResource('View');
}
フロントコントローラープラグインでログイン/ログアウトを処理しているため、レイアウトのリソースプラグインを作成していません。レイアウト構成は、ユーザーがログインしているかどうか(およびその他のコンテキスト関連情報)によって異なります。私は私のapplication.iniの次の行でレイアウトを生き生きとさせています:
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/professional"
resources.layout.layout = "ver1"
次に、フロントコントローラープラグインを使用して構成します。プラグインは次のとおりです。
public function postDispatch(\Zend_Controller_Request_Abstract $request) {
$layout = Zend_Layout::getMvcInstance();
$path = $layout->getLayoutPath();
// include static content
$layout->header = include($path . '/includes/header.phtml');
$layout->footer = include($path . '/includes/footer.phtml');
if(APPLICATION_ENV == 'development') {
$layout->dev = include($path . '/includes/dev.phtml');
}
if(RW_Helper::isLoggedIn()) {
$layout->sidebar = include($path . '/includes/sbar_secure.phtml');
} else {
$layout->sidebar = include($path . '/includes/sbar_public_login.phtml');
}
}
(私はそれが特にきれいではないことを知っていますが、後でそれを扱います)。
さて、問題は、これを実行できる唯一のイベントがpostDispatchイベントであるということです。たとえば、dispatchLoopStartupで実行しようとすると、「警告:UiWidgetElementデコレータは...に登録されたビューオブジェクトがないとレンダリングできません」などのエラーが発生します。
探しているビューオブジェクトがわかりません。(レイアウトビューとアプリケーションビューに別々のものはありますか?)そして、どこに/どのように注入または提供する必要があるのかわかりません。私がリソースとして設定したビューを追跡している場合は、ブートストラップを参照することで簡単に見つけることができると思います...
レイアウトをpostDispatchイベントにアタッチしたままにしたくないのは、a)意味的に正しくないと感じ、b)複数回実行するリスクがあるためです(リクエストで複数のアクションを実行する場合)。
私は何が欠けていますか?
ありがとう!