アプリケーション

アプリケーションは以下のような順番で実行されます。

boot -> compile -> request(route, method, interceptor) -> response(representation) -> exit

0. コンパイル

与えられた$contextに対応するDIとAOPの設定で、routertransferなどアプリケーションの実行に必要なサービスを保持する$appオブジェクトが作られます。

1. リクエスト

HTTPリクエストはrouterでアプリケーションのリソースへのリクエストに変換され実行されます。 リソースのmethodではリソース状態code,header, bodyにセットします。

2. レスポンス

リソースのレンダラーがリソースの状態表現(JSONやHTML)にして、クライアントに転送します。 (REpresentational State Transfer)

bootファイル

アプリケーションを実行するわずか2行のPHPスクリプトです。var/www/index.phpbootstrap/api.php等に設置してWebサーバーやコンソールアプリケーションのエントリーポイントにします。 スクリプトではグローバル変数$contextにコンテキストを指定してbootstrap.phpファイルを読み込むとアプリケーションが実行されます。

$context = 'prod-api-hal-app'
require 'pat/to/bootstrap.php';

コンテキストに応じてbootファイルを選択します。

// fire php server
php -S 127.0.0.1:8080 var/www/index.php

// console access
php bootstrap/api.php get /user/1

// web access
php -S 127.0.0.1:8080 bootstrap/api.php

アプリケーションコンテキスト

コンテキストに応じてアプリケーションオブジェクト$appの構成が変わり、振る舞いが変更されます。 例えばデフォルトの設定ではRouterInterfaceWebRouterが束縛されていますが、CliではRouterInterfaceCliRouterが束縛され(HTTPリクエストの代わりに)コンソールの入力値が入力値になります。 また、キャッシュや認証、ログなどmethodの前後に実行されるインターセプターもコンテキストに応じて変わります。

フレームワークが用意しているbuilt-inコンテキストとアプリケーションが作成するカスタムコンテキストがあります。

built-inコンテキスト

  • api APIアプリケーション
  • cli コンソールアプリケーション
  • hal HALアプリケーション
  • prod プロダクション

コンテキストは組み合わせて使う事ができます。

  • appは基本のアプリケーションです。リソースはJSONでレンダリングされます。
  • apiはデフォルトのリソースをpageリソースからappリソースに変更します。page://self/にマップされているWebのルートアクセス(GET /)はapp://self/へのアクセスになります。
  • cli-appにするとコンソールアプリケーションになり、prod-hal-api-appだとHALメディアタイプを使ったプロダクション用のAPIアプリケーションになります。

アプリケーションコンテキスト(cli, app..)はそれぞれのモジュールに対応します。例えばcliCliModuleに対応しており、コンソールアプリケーションのためのDIとAOPの束縛が行われます。

コンテキストの値はオブジェクトグラフの作成のみに使われます。コンテキストを参照してアプリケーションやライブラリが振る舞いを変える事は推奨されません。その代わりにインターフェイスのみに依存したコードコンテキストによる依存の変更で振る舞いを変えます。