アプリケーション

実行シーケンス

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

0. コンパイル

コンテキストに応じたDIとAOPの設定で、アプリケーションの実行に必要なルートオブジェクト$appを生成します。$appはroutertransferなどアプリケーションの実行に必要なサービスオブジェクトで構成されます。1 $appはシリアライズされ各リクエストで再利用されます。

  • router - 外部入力をリソースリクエストに変換
  • resource - リソースクライアント
  • transfer - 出力

1. リクエスト

リクエストに基づき、リソースオブジェクトが作成されます。

リクエストに応じて onGetonPost などに応答するメソッドを持つリソースオブジェクトは、自身のリソースの状態として 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コンテキストによる束縛の変更で振る舞いを変更します。


  1. オブジェクトは他のオブジェクトを保持しているか、保持されているかによって繋がっています。これを[Object Graph] (http://en.wikipedia.org/wiki/Object_graph)といいます。$appはそのルートオブジェクトです。 

  2. 依存性逆転の法則