CakePHP 3 コントローラ実行までのプロセスを追う 中編


CakePHP 3 コントローラ実行までのプロセスを追う 前編の続きです。

index.php に残されたのは次の5行です。

DispatcherFactory::create() を見てみます。

DispatcherFactory::create()

create メソッド では Dispatcher のインスタンスを作っています。 Factory のお決まりの使い方です。 作成されるのは CoreRoutingDispatcher です。 Dispathcer クラス では特にコンストラクタも記述されていませんので、 シンプルにインスタンスを作ることになります。

そして foreach を使って static::$_stack の中に格納されたフィルタを addFilter で追加していきます。 ここで前編で見ていた4つのフィルタが追加されます。

addFilter の中身を見てみます。

addFilter

addFilter の中で実行されている $this->eventManager()Dispatcher.php では定義されていませんが、 Dispatcher が使用する EventManagerTrait で定義されています。

eventManager

eventManager() が実行されると $this->>_eventManagerの値、 EventManager のインスタンスが返されます。

そして addFilter に戻って、 on のところで イベントリスナ としてフィルタが追加されていきます。

on

引数には フィルタのインスタンスが渡されます。 今回出てくるフィルタはすべて DispatcherFilter を継承しており、 DispatcherFilterEventListenerInterface を実装していますから、 最初の if 節 が実行され、 _attachSubscriber が実行されて終了します。

_attachSubscriber を見てみます。

_attachSubscriber

コールバックを設定しています。

このメソッドでは、implementedMethod で設定するべきコールバックを導き出して $this->on($eventKey, $options, $method) を実行しています。

implementedMethod を使用していますが、 それぞれの フィルタ では実装されておらず、 フィルタの親クラスとなっている DispatcherFilter で実装されています。

implementedEvents

_attachSubscriber に戻って見てみると、 最初の if 節 が実行されて _extractCallable が呼び出されることがわかります。

_extractCallable の中身を見てみます。

_extractCallable

引数 $function は配列が、 $object には $subscriber すなわちフィルタのインスタンスが割り当てられます。 そして $method には 'handle' が、 $options には連想配列が代入されます。 handle がどんなメソッドかは必要になったときにまた調べるとして、処理を読み進めます。

処理を追っていくと on('Dispatcher.beforeDispatch', ['priority' => 10], [FilterObject, 'handle']); のようなコードが実行されることがわかります。 _listener の配列に イベントと priority をキーにして オブジェクトとそのメソッドの配列が追加されていることがわかります。

このイベントリスナの登録が終わると、リクエストの処理が始まります。

後編に続きます。