dietcake advent calendar 2014 の6日目です。
今日はLaravel コードからフレームワークの起動から終了までの流れを追う – Shin x blog という Laravel の記事が非常にわかりやすかったので、この記事を参考にさせていただきながら、dietcake の起動から終了までの流れを紹介します。

とはいえ、dietcakeそのものはcoreでしかないので、実際にアプリケーションとして動作させるための最低限のひな形を用意した spongecake を元にして解説していきたいと思います。

結論から言うとこんな感じです。

dietcake_flowchart.png

まず最初にアクセスされるエントリポイントは、app/webroot/index.php になります。ここでは、基準となるディレクトリ定数の定義を行い、bootstrapと設定値のロード、dispatcherの実行を行っています。

<?php
define('ROOT_DIR', dirname(dirname(__DIR__)).'/');
define('APP_DIR', ROOT_DIR.'/app/');
require_once ROOT_DIR.'vendor/dietcake/dietcake/dietcake.php';
require_once CONFIG_DIR.'bootstrap.php';
require_once CONFIG_DIR.'core.php';
Dispatcher::invoke();

index.phpの1,2行目で作られたROOT_DIR定数と、APP_DIR定数を元にして、require_once ROOT_DIR.’vendor/dietcake/dietcake/dietcake.php’; では各種ディレクトリを参照するための定数と、dietcake coreに搭載されているcontroller.phpやmodel.phpといったクラスをロードしています。

次に、index.phpの4行目にあるrequire_once CONFIG_DIR.’bootstrap.php’;で、アプリケーションの動作に必要なライブラリのロードや初期設定を行います。
spongecakeでは、composer の autoloader やアプリケーション毎にカスタムするためのappクラス、helperなどを読み込んでいます。
また、アプリケーション内で実装されたcontrollerやmodelを呼び出すためにspl_autoload_registerを使っています。

index.phpのrequire_once CONFIG_DIR.’core.php’;には、アプリケーションの設定が記述されているのでそれを読み込んでいます。URLやDBの接続先、error_reportingの設定などを行います。

これらの下準備的が終わったら、 Dispatcher::invoke() が実行され、フレームワークとしての処理がスタートします。

    public static function invoke()
    {
        list($controller_name, $action_name) = self::parseAction(Param::get(DC_ACTION));

        $controller = self::getController($controller_name);

        $controller->action = $action_name;
        $controller->beforeFilter();
        $controller->dispatchAction();
        $controller->afterFilter();

        echo $controller->output;
    }

invokeメソッドに書かれているコードを見ると、このメソッドが何をするのか非常に分かりやすいですね。
まず最初の行で、リクエストパラメーターを元に実行すべきアクション(どのコントローラーのどのメソッドを実行するのか)を取り出します。
dietcakeの場合、フレームワークが受け取るリクエストパラメータは必ず「http://example.com/index.php?dc_action=controller-name/action-name」の形が前提になっています。ルーティングの判定などはdietcakeに来る前にmod_rewriteを使うなどして実現します。

次に、対象となるコントローラークラスを取り出し、実行されるアクション名をメンバに代入したあと、beforeFilterを実行、actionを実行、afterFilterを実行します。
beforeFilter()と、afterFilter()は、アクションが実行される前と後に、予め定義しておいた処理を実行できる仕組みです。すべての画面で利用するシステム変数の取得を行ったりする時に使います。(が、大抵は認証とか入れ始めてfilterのon/offを意識しないといけなくなってコードが複雑になるのでfilterの利用自体あまりオススメしません)

dispatchAction()は、リクエストされたアクションが存在するかチェックしたあと実行し、さらにViewクラスを使ってレンダリングを実行します。アクションの役割は「リクエストを受け取り、必要ならモデルを呼び出し、その結果を受け取り、ビューに渡す」です。
ビューは、アクションから受け取った値を整形し、その結果をコントローラーに渡します。

最後にコントローラーがビューからもらった出力結果をechoして終了です。

フレームワークを採用するときは、そのフレームワークのコードを全部読んでからにすると、無駄なハマりや選定ミスの確立を減らせるのでオススメです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ねこ認証:9つのパネルの中からねこを3匹選んでください