レンダリングと転送
ResourceObjectのリクエストメソッドではリソースの表現について関心を持ちません。コンテキストに応じて注入されたレンダラーがリソースの表現を生成します。同じアプリケーションがコンテキストを変えるだけでHTMLで出力されたり、JSONで出力されたりします。
遅延評価
レンダリングはリソースが文字列評価された時に行われます。
$weekday = $api->resource->get('app://self/weekday', ['year' => 2000, 'month'=> 1, 'day'=> 1]);
var_dump($weekday->body);
//array(1) {
// ["weekday"]=>
// string(3) "Sat"
//}
echo $weekday;
//{
// "weekday": "Sat",
// "_links": {
// "self": {
// "href": "/weekday/2000/1/1"
// }
// }
//}
レンダラー
それぞれのResourceObjectはコンテキストによって指定されたその表現のためのレンダラーが注入されています。リソース特有のレンダリングを行う時はrenderer
プロパティを注入またはセットします。
例)デフォルトで用意されているJSON表現のレンダラーをスクラッチで書くと:
class Index extends ResourceObject
{
#[Inject]
public function setRenderer(RenderInterface $renderer)
{
$this->renderer = new class implements RenderInterface {
public function render(ResourceObject $ro)
{
$ro->headers['content-type'] = 'application/json;';
$ro->view = json_encode($ro->body);
return $ro->view;
}
};
}
}
転送
ルートオブジェクト$app
にインジェクトされたリソース表現をクライアント(コンソールやWebクライアント)に転送します。通常、出力はheader
関数やecho
で行われますが、巨大なデータなどにはストリーム転送が有効です。
リソース特有の転送を行う時はtransfer
メソッドをオーバーライドします。
public function transfer(TransferInterface $responder, array $server)
{
$responder($this, $server);
}
リソースの自律性
リソースはリクエストによって自身のリソース状態を変更し、それを表現にして転送する機能を各クラスが持っています。