実行の順序はinit()、preDispatch()、そしてaction()の順だと思います。
Init()またはpreDispatch()で、すべてのアクションに共通する変数を初期化する必要がありますか?初期化に両方の関数を使用している人を見てきました。おそらく名前が示すように、init()で実行する必要がありますが、preDispatch()ではどのようなことが行われますか?
Init()関数呼び出しとpreDispatch()関数呼び出しの間で何が起こりますか?
最初にpreDispatch()
が_Zend_Controller_Plugin_Abstract
_のインスタンスに対して呼び出されます。ここにリクエストオブジェクトとレスポンスオブジェクトがあるので、リクエストをフィルタリングしたり、リクエストの情報を使用して準備をしたりできます。
次に、コンストラクターの一部として_Zend_Controller_Action
_のinit()
が呼び出されます。コンストラクターのシグネチャ(Zend_Controller_Action::__contruct()
)をオーバーライドして繰り返すことなく、コントローラーを初期化するのに役立ちます。
ここでは、コントローラーのpreDispatch()
メソッドが呼び出されます。 $request->setDispatched(false)
を呼び出して、現在のアクションをスキップできます-init()
でそれを実行できるかどうかはわかりません
次に、アクションメソッドが呼び出されます(たとえば、viewAction()
)。ここでは、モデルからデータをフェッチしてビューにデータを入力するなどの通常の作業を行います。
したがって、区別は明確になります。
preDispatch()
以外にrouteStartup
と others があります)。init
またはpreDispatch()
、
init()
とpreDispatch()
関数呼び出しの間はどうなりますか?
ほとんど何もありません-preDispatch()
が実行され、$request->setDispatched(false)
を呼び出していない場合は、アクションが実行されます。
init() メソッドは、主にコンストラクターを拡張することを目的としています。通常、コンストラクターはオブジェクトの状態を設定するだけで、多くのロジックを実行する必要はありません。これには、コントローラーで使用されるリソース(モデル、構成オブジェクトなど)の初期化、またはフロントコントローラー、ブートストラップ、またはレジストリから取得した値の割り当てが含まれる場合があります。
preDispatch() メソッドを使用して、オブジェクトまたは環境(ビュー、アクションヘルパーなど)の状態を設定することもできますが、その主な目的は、要求されたアクションを実行する必要があるかどうかを判断することです。派遣されます。そうでない場合は、 _ forward を別のアクションに移動するか、例外をスローする必要があります。
注: _ forward は、2つのメソッドの意図を形式化したinit()から実行すると、実際には正しく機能しません。
init()
:関数の前にロードされるため、プロジェクトのすべての関数の前にロードする場合は、bootstrapクラスに配置します。指定したクラス関数の前に配置する場合は、 init()
このクラス関数。
preDispatch()
:フロントコントローラーの前にロードされます。