Table of Contents
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::load
、DispatcherFactory::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)
で DebugBarFilter
を DispatcherFactory
のフィルタとして追加しています。 DispatcherFactory::add($debugBar)
に辿り着くまで、結構な数の設定値を読み込んでいます。 設定値は app.php
の内容次第で変わってきます。
DebugKit
を load
した後に 、 3つのクラスについて DispatcherFactory::add
が実行されています。
DispatcherFactory::add
実行されるべきミドルウェアオブジェクトを追加するものです。
add
メソッド の引数は、 全て文字列 'Asset'
、'Routing'
、'ControllerFactory'
でしたから、 _createFilter
の返り値が static::$_stack
に追加されます。
_createFilter
でなにが返ってくるかを見てみましょう。
_createFilter
コメントから明らかですが、 フィルタのインスタンスを作ります。
App::className
は 以前の記事で詳しく見ましたが、引数を元にネームスペース付きのクラス名を作って返します。
ここでは 'Asset'
, 'Routing'
, 'ControllerFactory'
について add
が呼び出されていて、 Routing\Filter\AssetFilter
、 Routing\Filter\RoutingFilter
、 Routing\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行です。
中編に続きます。