0

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)複数回実行するリスクがあるためです(リクエストで複数のアクションを実行する場合)。

私は何が欠けていますか?

ありがとう!

4

1 に答える 1

2

コードの外観から、ビューレンダラーからビューオブジェクトにアクセスしようとしています。これはpostDispatchで自動的に初期化されるため、コードはpostDispatchフックとしてのみ機能します。

あなたが経験している苦痛の一部は、ディスパッチプロセス中にテンプレートをレンダリングしようとして、アプリケーションとプレゼンテーションロジックを組み合わせようとしているためだと思います。あなたはあなたの質問であなたのプラグインコードは特にきれいではないと言いました、しかしあなたはこれを簡単に単純化すると同時にあなたの問題を解決することができます。

このプラグインを完全に削除してから、レイアウト自体からこれらのテンプレートをレンダリングすることをお勧めします。例:

<?=$this->render('includes/header.phtml')?>

同じ方法でレイアウトにログインチェックを行うか、これをビューヘルパーに移動します。ビューオブジェクトはすでに設定されているので、これで問題が解決するはずです。

于 2013-01-21T13:20:58.120 に答える