web-dev-qa-db-ja.com

Zend Framework:コントローラーオブジェクトのinit()関数とpreDispatch()関数の違いは何ですか?

実行の順序はinit()、preDispatch()、そしてaction()の順だと思います。

  1. Init()またはpreDispatch()で、すべてのアクションに共通する変数を初期化する必要がありますか?初期化に両方の関数を使用している人を見てきました。おそらく名前が示すように、init()で実行する必要がありますが、preDispatch()ではどのようなことが行われますか?

  2. Init()関数呼び出しとpreDispatch()関数呼び出しの間で何が起こりますか?

28
understack

最初にpreDispatch()が_Zend_Controller_Plugin_Abstract_のインスタンスに対して呼び出されます。ここにリクエストオブジェクトとレスポンスオブジェクトがあるので、リクエストをフィルタリングしたり、リクエストの情報を使用して準備をしたりできます。

次に、コンストラクターの一部として_Zend_Controller_Action_のinit()が呼び出されます。コンストラクターのシグネチャ(Zend_Controller_Action::__contruct())をオーバーライドして繰り返すことなく、コントローラーを初期化するのに役立ちます。

ここでは、コントローラーのpreDispatch()メソッドが呼び出されます。 $request->setDispatched(false)を呼び出して、現在のアクションをスキップできます-init()でそれを実行できるかどうかはわかりません

次に、アクションメソッドが呼び出されます(たとえば、viewAction())。ここでは、モデルからデータをフェッチしてビューにデータを入力するなどの通常の作業を行います。

したがって、区別は明確になります。

  • すべてのアクションの前に何かを実行したい場合は、プラグインに入れてフックの1つを使用します(preDispatch()以外にrouteStartupothers があります)。
  • コントローラ内のすべてのアクションの前に必要な場合-initまたはpreDispatch()
  • 単一のアクションの場合のみ-アクション自体。

init()preDispatch()関数呼び出しの間はどうなりますか?

ほとんど何もありません-preDispatch()が実行され、$request->setDispatched(false)を呼び出していない場合は、アクションが実行されます。

28
Emil Ivanov
  • init() メソッドは、主にコンストラクターを拡張することを目的としています。通常、コンストラクターはオブジェクトの状態を設定するだけで、多くのロジックを実行する必要はありません。これには、コントローラーで使用されるリソース(モデル、構成オブジェクトなど)の初期化、またはフロントコントローラー、ブートストラップ、またはレジストリから取得した値の割り当てが含まれる場合があります。

  • preDispatch() メソッドを使用して、オブジェクトまたは環境(ビュー、アクションヘルパーなど)の状態を設定することもできますが、その主な目的は、要求されたアクションを実行する必要があるかどうかを判断することです。派遣されます。そうでない場合は、 _ forward を別のアクションに移動するか、例外をスローする必要があります。


注: _ forward は、2つのメソッドの意図を形式化したinit()から実行すると、実際には正しく機能しません。

9
ainokna

init():関数の前にロードされるため、プロジェクトのすべての関数の前にロードする場合は、bootstrapクラスに配置します。指定したクラス関数の前に配置する場合は、 init()このクラス関数。

preDispatch():フロントコントローラーの前にロードされます。

0
Mustafa Magdi