アプリケーション
実行シーケンス
アプリケーションは、コンパイル、リクエスト、レスポンスの順で実行されます。
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し、コンテキストによる束縛の変更で振る舞いを変更します。
-
オブジェクトは、他のオブジェクトを保持しているか、保持されているかによって繋がっています。これをObject Graphといい、$appはそのルートオブジェクトとなります。 ↩