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


CakePHP 3 で コントローラ が実行されるまでのプロセス、 前処理 がどうなっているのか気になって調べました。 予想以上に追いかけるのが大変だったので簡単に済ませたところがいくつもあります。 きっとこの記事を読むのも大変だと思います。

環境

  • PHP 5.5.9
  • cakephp/cakephp 3.0.9
  • Ubuntu 14.04.2 LTS

まずサーバを起動します。 “php bin/cake.php server“。 サーバがリクエストを受けて CakePHP 3 が HTML を生成するとき、 まず最初に webroot/index.php が実行されます。 まず index.php の中を見てみます。

index.php

bootstrap.php で初期設定をして、 DispatcherFactory で作成した dispatcher が リクエストを処理しています。

bootstrap.php について、 関係してくるところを説明します。

bootstrap.php

Plugin::loadDispatcherFactory::add で dispatcher filter (ディスパッチャフィルタ) を登録しています。 Plugin::load('DebugKit', ['bootstrap' => true]); のところは app.php で設定した値に応じて読み込まれます。 app.php は一種の設定ファイルです。 (関連記事: CakePHP3 環境ごとに設定ファイルを分ける方法)。

Plugin::load

コメントのみ読んでみます。

ここから、Plugin::load('DebugKit', ['bootstrap' => true]) で プラグインの中の bootstrap.php を読み込むことがわかります。

DispatcherFactory::add($debugBar)DebugBarFilterDispatcherFactory のフィルタとして追加しています。 DispatcherFactory::add($debugBar) に辿り着くまで、結構な数の設定値を読み込んでいます。 設定値は app.php の内容次第で変わってきます。

DebugKitload した後に 、 3つのクラスについて DispatcherFactory::add が実行されています。

DispatcherFactory::add

実行されるべきミドルウェアオブジェクトを追加するものです。

add メソッド の引数は、 全て文字列 'Asset''Routing''ControllerFactory'でしたから、 _createFilter の返り値が static::$_stack に追加されます。

_createFilter でなにが返ってくるかを見てみましょう。

_createFilter

コメントから明らかですが、 フィルタのインスタンスを作ります。

App::className は 以前の記事で詳しく見ましたが、引数を元にネームスペース付きのクラス名を作って返します。
ここでは 'Asset', 'Routing', 'ControllerFactory' について add が呼び出されていて、 Routing\Filter\AssetFilterRouting\Filter\RoutingFilterRouting\Filter\ControllerFactoryFilter_createFilter の返り値として返されます。

ここまでをまとめると、 static::$_stack に次の4つのクラスのインスタンスが追加されることになります。

  • DebugKit\Routing\Filter\DebugBarFilter
  • Cake\Routing\Filter\AssetFilter
  • Cake\Routing\Filter\RoutingFilter
  • Cake\Routing\Filter\ControllerFactoryFilter

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

中編に続きます。