アプリケーションはオブジェクトグラフの続きです。アプリケーションスクリプトを見ることでBEAR.Sundayの基本動作を解説します。
前回まで
1.オートローダーの登録
require dirname(__DIR__) . '/vendor/autoload.php';
2.アプリケーションインスタンスの生成
$app = (new Injector(new AppModule))->getInstance(AppInterface::class);
アプリケーションはスクリプトで利用するサービスを保持するだけのインスタンスです。
3.ルーター
$request = $app->router->match($GLOBALS);
スーパーグローバル変数からマッチした$request
を取得します。
4. リクエスト
ルーターでマッチした$request
のリクエストメソッド、リソースパス、クエリーでページリソースへのリクエストをつくります。
$page = $app->resource
->{$request->method} // 'get'
->uri($request->path) // 'page://self/'
->withQuery($request->query) // []
->request();
上記のコードで作成されるのはリクエストです。
request()
の前にeager
をつければリクエストではなく、リクエストを行った結果が返ります。
->request(); // リクエスト
->eager->request(); // リクエスト結果
リソースリクエストでページリソースは値を持ちます。
5.トランスファー
$page()->transfer($app->responder);
ページリソースのリクエストを行い、アプリケーションが持つレスポンダー($app->responder
)を使ってクライアントに転送します。
(このデモはWeb用なのでheader関数でヘッダーを出力して、echoでコンテンツを出力しています。)
リクエストの処理中の例外はHTTPコードに準じたPHPの例外をキャッチして処理します。
アプリケーションの
「ページにリクエストが行われ、その表現結果が出力される」... アプリケーションスクリプトはこのHTTPリクエストの働きを単純に記述しています。
リソースクラス
HelloWorldアプリのページリソースクラスです。
<?php
namespace MyVendor\HelloWorld\Resource\Page;
use BEAR\Resource\ResourceObject;
class Index extends ResourceObject
{
public function onGet($name = 'World')
{
$this->body['greeting'] = 'Hello ' . $name;
return $this;
}
}
GETメソッドの時に渡されたクエリー(?name=Name
)を使い、自身のコンテンツ($this->body
)を返しています。クエリーがついていないときはWorld
が使われます。
ルーターからディスパッチされて呼ばれる箇所でMVCフレームワークでいうとコントローラーに当たる箇所なのですがこれもリソースです。
- リクエストオブジェクトを利用していない
- リクエストメソッドを判別していない
- 出力に対して無関心(出力を行っていない)
- 責任を持つのは出力ではなく自身の構成
コントローラーと違うのはこんなところでしょうか。
他のリソースを扱う事もできるのでコントローラーとしての側面もありますが、そのドメインだけを取り扱うという点ではモデルのようでもあります。また実際そのまま出力できるのでレスポンスオブジェクトのようになものとも言えます。
Object as a service
リソースクラスは統一されたメソッドを持ちPHP標準の順序順の引数ではなく名前付き引数で呼ばれます。コード
、ヘッダー
、ボディ(コンテンツ)
の公開された(public)プロパティを持ちPHPのクラスとRESTのリソースが融合しています。
リソースオブジェクトはサービスとして振舞います。アクセスするには通常のPHPシンタックスではなく、アプリケーションスクリプトでリクエストの時に使ったリソースクライアントを使ってアクセスします。
- 統一されたメソッド
- URI
- クエリー(名前付き引数)
- ステートレス
BEAR.Sundayのアプリケーションはこれらの極小のPHPのサービスを提供するリソースの集合です。
まとめ
- アプリケーションスクリプトは起動から終了までの動作(ページがリクエストされその表現が転送されること)が記述されています。
- アプリケーションスクリプトにはMVCという3つのコンポーネントではなく、リソースというコンポーネントだけが登場しています。
- リソースはPHPのオブジェクトですがWebサービスのように振舞います。
- アプリケーションはリソースの集合です。