5

シングルトン、レジストリ、静的プロパティ、ベース コントローラーを回避するなど、確立されたベスト プラクティスを順守しようとする場合、レイアウト (およびレイアウトで使用されるパーシャル) に、レイアウトのみで使用され、すべてのアクションで共通のデータを入力するにはどうすればよいでしょうか?

典型的なシナリオは、データベースのような変数データに基づいて構築されたメニューです。関心の分離を念頭に置いて、ビュー/レイアウトはバックエンドと直接やり取りするべきではなく、何を含めるかを伝えます。

Zend_Layout のシングルトン「機能」を使用しないと、フロント コントローラー プラグインを使用することはできません。プラグインはリクエスト オブジェクトとレスポンス オブジェクトのみを認識し、コントローラー、ビュー、またはレイアウトへのアクセスはありません。

Zend のアクション ヘルパーには、init/preDispatch/postDispatch メソッドがあります。アクション ヘルパーを HelperBroker に追加することができ (例: ブートストラップを使用)、これらは通常のアプリケーション フローで実行されます。

init-method を使用してデータをビューに挿入することはできません。これは、コントローラー/ビューの準備が整う前にトリガーされるためです。preDispatch/postDispatch は可能ですが、コントローラー アクションの実行時にこれらのメソッドが常にトリガーされるため、完全ではありません。

つまり、Zend_Controller_Action::_forward() を使用すると、すべてのアクション ヘルパーで preDispatch/postDispatch も実行されます。これは、速度以外のコードに大きな影響を与えることはありません。ビュー (またはビュー ヘルパー) 変数を何度も設定したくありません。ある種の $firstRun 変数を使用してこの問題を回避するコードを作成できますが、自分のコードでこれを追跡したくありません。

別の方法はブートストラップでこれを行うことですが、私の意見では、実際にはそこに属していません。

では、レイアウト/ビュー ヘルパーにデータベースからのデータを取り込むにはどうすればよいでしょうか。それを 1 回だけ実行し、それでも問題を適切に分離できますか?

4

3 に答える 3

0

この回答で述べられているように、アクションヘルパーを使用することもできます(質問も見てください。あなたの質問と非常によく似ています)。

于 2012-05-15T18:00:02.833 に答える
0

ActionHelperメソッドにビュー変数を設定して、アプローチに従いましたpreDispatch。私の意見では、それは最も論理的な場所でした。さらに、私のプロジェクトでは を使用してZend_Controller_Action::_forward()いなかったので、ヘルパーの複数回のトリガーについて速度の問題はありませんでした。

それが役立つことを願って、

于 2012-05-15T14:07:30.030 に答える
0

アクションヘルパーも使用します。ビュー変数を入力し、単純な PHP/partials/render/viewHelper を使用して表示するだけです (複雑さによって異なります)。

preDispatch を使用した複数回の実行に関する問題は、次を使用して解決できます

if (!($this->view->myVar)) { // or array_key_exist or isset - depending on your use case
    $this->view->myVar = $someModel->getSomeData();
}

これはIMOで問題ありません。

于 2012-05-15T18:21:07.697 に答える