アプリケーション

実行シーケンス

アプリケーションは、コンパイル、リクエスト、レスポンスの順で実行されます。

0. コンパイル

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

1. リクエスト

HTTPリクエストはrouterでアプリケーションのリソースへのリクエストに変換され実行されます。 リソースのmethodではリソース状態code,header, bodyにセットします。methodには束縛されたインタセプターがキャッシュやトランザクションなどのアプリケーションロジックをAOPで実行します。

2. レスポンス

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

bootファイル

アプリケーションを実行するわずか2行のPHPスクリプトです。public/bin/等に設置してWebサーバーやコンソールアプリケーションのエントリーポイントにします。 スクリプトはbootstrap.phpスクリプトにコンテキストを指定してアプリケーションを実行します。

<?php
require dirname(__DIR__) . '/autoload.php';
exit((require dirname(__DIR__) . '/bootstrap.php')('prod-html-app'));

コンテキストに応じてbootファイルを選択します。 同一ファイルでWebサーバースクリプトにもコンソールアクセスのスクリプトにもなります。

// fire php server
php -S 127.0.0.1:8080 public/index.php
// console access
php bin/app.php get /user/1

コンテキスト

コンテキストに応じてアプリケーションオブジェクト$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の束縛が行われます。

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