Table of Contents
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
を継承しており、 DispatcherFilter
は EventListenerInterface
を実装していますから、 最初の 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 をキーにして オブジェクトとそのメソッドの配列が追加されていることがわかります。
このイベントリスナの登録が終わると、リクエストの処理が始まります。
後編に続きます。