アプリケーション
実行シーケンス
コンパイル、リクエスト、レスポンスの順でアプリケーションが実行されます。
0. コンパイル
コンテキストに応じたDIとAOPの設定で、アプリケーションの実行に必要なルートオブジェクト$app
を生成します。$appはrouter
やtransfer
などアプリケーションの実行に必要なサービスオブジェクトで構成されます。1 $appはシリアライズされ各リクエストで再利用されます。
- router - 外部入力をリソースリクエストに変換
- resource - リソースクライアント
- transfer - 出力
1. リクエスト
リクエストに基づき、リソースオブジェクトが作成されます。
リクエストに応じて onGet
や onPost
などに応答するメソッドを持つリソースオブジェクトは、自身のリソースの状態として code
または body
プロパティを設定します。
リソースオブジェクトのメソッドは、リソースの状態を変更するためだけのものであり、表現そのもの(HTML、JSONなど)には関心がありません。
メソッドの前後では、ログや認証などメソッドに束縛されたアプリケーションロジックがAOPで実行されます。
2. レスポンス
リソースに注入されたレンダラーがJSONやHTMLなどのリソースの状態表現を作りクライアントに転送します。 (REpresentational State Transfer=REST)
bootスクリプト
public/
やbin/
等のエントリーポイントに設置され、アプリケーションを実行します。
スクリプトではアプリケーション実行コンテキストを指定して実行します。
require dirname(__DIR__) . '/autoload.php';
exit((new Bootstrap())('app', $GLOBALS, $_SERVER));
デフォルトではWebサーバースクリプトです。
php -S 127.0.0.1:8080 public/index.php
cli
コンテキストを付加するとコンソールアプリーケーションのスクリプトになります。
exit((new Bootstrap())('cli-app', $GLOBALS, $_SERVER));
php bin/app.php get /user/1
コンテキスト
コンテキストは特定の目的のためのDIとAOPの束縛のセットです。コードは同じでも束縛が変わることで、アプリケーションが違う振る舞いをします。 コンテキストはフレームワークが用意しているbuilt-inコンテキストとアプリケーションが作成するカスタムコンテキストがあります。
built-inコンテキスト
app
ベースアプリケーションapi
APIアプリケーションcli
コンソールアプリケーションhal
HALアプリケーションprod
プロダクション
app
の場合、リソースはJSONでレンダリングされます。
api
はデフォルトのリソースのスキーマをpageからappに変更します。webのルートアクセス(GET /)はpage://self/からapp://self/へのアクセスになります。
cli
にするとコンソールアプリケーションになります。
prod
はキャッシュの設定などをプロダクション用にします。
コンテキスト名はそれぞれのモジュールに対応します。例えばappはAppModule, cliはCliModuleに対応します。
コンテキストは組み合わせて使う事ができます。例えばprod-hal-api-app
ならプロダクション用HALのAPIアプリケーションなどになります。
カスタムコンテキスト
アプリケーションのsrc/Module
/に設置します。built-inコンテキストと同名にするとカスタムコンテキストが優先されます。カスタムコンテキストからbuilt-inコンテキストを呼び出すことで一部の束縛を上書きする事ができます。
コンテキスト無知
コンテキストの値はルートオブジェクトの作成のみに使われその後に消滅します。アプリケーションから参照可能なグローバルな”モード”は存在せず、アプリケーションは現在実行されているコンテキストを知ることはできません。外部の値を参照して振る舞いを変えるのではなく、インターフェイスのみに依存2しコンテキストによる束縛の変更で振る舞いを変更します。