シングルトン、レジストリ、静的プロパティ、ベース コントローラーを回避するなど、確立されたベスト プラクティスを順守しようとする場合、レイアウト (およびレイアウトで使用されるパーシャル) に、レイアウトのみで使用され、すべてのアクションで共通のデータを入力するにはどうすればよいでしょうか?
典型的なシナリオは、データベースのような変数データに基づいて構築されたメニューです。関心の分離を念頭に置いて、ビュー/レイアウトはバックエンドと直接やり取りするべきではなく、何を含めるかを伝えます。
Zend_Layout のシングルトン「機能」を使用しないと、フロント コントローラー プラグインを使用することはできません。プラグインはリクエスト オブジェクトとレスポンス オブジェクトのみを認識し、コントローラー、ビュー、またはレイアウトへのアクセスはありません。
Zend のアクション ヘルパーには、init/preDispatch/postDispatch メソッドがあります。アクション ヘルパーを HelperBroker に追加することができ (例: ブートストラップを使用)、これらは通常のアプリケーション フローで実行されます。
init-method を使用してデータをビューに挿入することはできません。これは、コントローラー/ビューの準備が整う前にトリガーされるためです。preDispatch/postDispatch は可能ですが、コントローラー アクションの実行時にこれらのメソッドが常にトリガーされるため、完全ではありません。
つまり、Zend_Controller_Action::_forward() を使用すると、すべてのアクション ヘルパーで preDispatch/postDispatch も実行されます。これは、速度以外のコードに大きな影響を与えることはありません。ビュー (またはビュー ヘルパー) 変数を何度も設定したくありません。ある種の $firstRun 変数を使用してこの問題を回避するコードを作成できますが、自分のコードでこれを追跡したくありません。
別の方法はブートストラップでこれを行うことですが、私の意見では、実際にはそこに属していません。
では、レイアウト/ビュー ヘルパーにデータベースからのデータを取り込むにはどうすればよいでしょうか。それを 1 回だけ実行し、それでも問題を適切に分離できますか?