BEAR.Sunday Note      rev 08
DIフレームワークRay.Di オブジェクトの生成と取得Ray.Aop 横断的利用                          コンポーネント構成図BEAR.Resource        サービスレイヤー        オブジェクトのリ...
Apache Tapestry                                              Apache Click                                                 ...
PUSH処理を要求するアクションを実行し、次に結果を出力するためにデータを表示のレイヤに“プッシュ”する。
Web Client                                                          Clinet Side                                           ...
Web                  CLI                       API                Service                               Clinet Side       ...
表示レイヤから処理を開始し、必要に応じて複数のコントローラからの処理の結果を“プル”する      Framework Architecture             PULL
Web Client                                                             Clinet Side                                        ...
Resource
Resource Client                              GET app://self/user?id=1                     USER                            ...
Resource Client                            GET app://self/user?id=1          User Page                                    ...
USER1    GET app://self/user?id=1        User Page         or               USER2 [‘name’=>‘koriym’, ‘status’=>’OK’]      ...
CQRS         NEWS     GET app://self/news/top             実行         LOGIN    GET app://self/login/current/user        ACL...
NEWS    インスタンス(実体)              LOGIN   インスタンス(実体)                AD    リクエスト       Top Page                              ...
Script File              http://www.grrinninbear.com.au/vet/vsb_cartoons/0403_02Cartoons.html
スクリプトファイル• 最上位の構成をスクリプトで記述• 大きな粒度のスクリプト• 素のPHPを参考に• グローバル変数使用
Native PHP Script                                             10年前のPHPを思い出そう                           スクリプトとは読み込         ...
スクリプトファイル web// Application$app = App::factory($runMode, $useCache);    ページリソースをHTMLと                                     ...
スクリプトファイル API                                   このスクリプトはリ                                   ソースをWeb APIとし                 ...
Dependency Injection
DI• インターフェイスに依存• オブジェクトの取得は基本しない• するならインジェクトされた専用ファ クトリで• Google Guice スタイルのアノテー ションベースのインジェクション
Object                                 DI                     dependency A                                                ...
Object                                    DI                     dependency A                                             ...
Injectable Module                  モジュールにはアプリ                  ケーションの全ての依                  存がセットされていま                  す。I...
DI @Inject インジェクトが欲しい ところに@Injectと マークします。/**  * @param Resource $resource Resource Client  *  * @Inject  */public functio...
DI Binding                このModuleではイン                                                       Moduleクラスは                ターフ...
Life Cycle /**                             初期化は   * @PostConstruct          @PostConstructメ   */                        ソッ...
DI Injected Factory        そのページで必要なコ       生成時のアノテーショ    /** ンストラクションは全       ンやバインディング、     * @param Resource        てキャ...
Scope                                         Scopeアノテーション                                         でsingletonか毎回生    /**  ...
オブジェクトは他のオブジェクトを必要とし   ページリソースを1つます。その他のオブ    取得したらすべてが連ジェクトも違うオブ    鎖取得され巨大なオブジェクトを必要としま   ジェクトグラフがつくす。           られます
これは全てがインジェクト済みのHelloWorldアプリです。                 これをUnserializeす                 るだけでこういうグラ                 フが得られます。       ...
Resource Request
Resource Request• リソースにはURIがあります• DSLでリクエスト• 名前引き数で• メソッドはHTTP準拠• 様々なリクエスト方法
Message passing in PHPClient                                               Service                  $service->read(1, 2)  ...
Message passing in BEARClient                                               Service  $resource  ->get 制限されたリクエストメソッド  ->ur...
Eager Request                               挨拶リソースにGETリ                               クエストをしていま          その結果を自分自身の       ...
Lazy Request                               eagerが無いとリクエ                               スト結果だけではな                           ...
Query Provider                                        クエリーの不足があれpublic function onGet($id)              ば、クエリープロバイ{       ...
Injectable Resource$schemeCollection = new SchemeCollection;$schemeCollection->scheme(app)         リソースのURIに応じて           ...
Return $this                                  リクエストされたリ                                  ソースは自身(リソー                       ...
Sync Request                          sync requestはリソー                          スリクエストをまとめ         実際の処理はスキーマ             ...
Resource Link• リソースはリンク可能です• リソース間の関係をクライアントでは なくリソース側が持ちます• Aタグのイメージです。関係性はカプセ ル化されクリックしただけで関連リ ソースにジャンプできます。
Resource LinkSelf                                        リソースはリンクする                                        ことができます。       ...
Resource LinkNew                                        linkNewのリンクは元public function onGet($lang)            のリンクとリンク先の   ...
Resource LinkCrawl                                        linkCrawlはbot(ク                                        ローラー)のイメー...
Aspect Oriented Programing
アスペクト指向• 横断的関心事 を扱います• メソッドインターセプター• アノテーションで指定
メソッドインターセ                                                   プターはメソッドを                                                   のっ...
@Aspect             アスペクト指向を適用             するクラスに/**          @Aspectとマークし             ます  *  * @Aspect  */class Aop exten...
MethodInterceptor                                        Ray.AopはAOPアラ/**                                     イアンスのインター  *...
@Log                                        Ray.AopはAOPアラ                                        イアンスのインター                ...
Hypermedia as the Engine of Application State
HATEOAS    • =Hypermedia as the Engine of                        状態遷移       Application State (状態マシンを       ハイパーメディアで表現する)...
rel linkpublic function onGet($drink)     リソース間の関係をリ{                                 ソース側が持っていま                          ...
Upcoming SlideShare
Loading in …5
×

BEAR.Sunday Note

3,736 views

Published on

PHP5.4フレームワーク BEAR.Sundayのノートスライドです。随時アップデートします。

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,736
On SlideShare
0
From Embeds
0
Number of Embeds
1,512
Actions
Shares
0
Downloads
6
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • BEAR.Sunday Note

    1. 1. BEAR.Sunday Note rev 08
    2. 2. DIフレームワークRay.Di オブジェクトの生成と取得Ray.Aop 横断的利用 コンポーネント構成図BEAR.Resource サービスレイヤー オブジェクトのリソース化 Monolog Guzzle Doctorine オブジェクトフレームワーク Aura.Router Aura.Web Aura.Cli Twig Smarty3 Haanga BEAR.Framework アプリケーションコントローラー zf2 Symfony2 PEAR リソースフレームワーク /vendor BEAR.Sunday
    3. 3. Apache Tapestry Apache Click CMS PUSH Framework Architecture PULL Ruby On Rails DjangoSymfony / CakePHP
    4. 4. PUSH処理を要求するアクションを実行し、次に結果を出力するためにデータを表示のレイヤに“プッシュ”する。
    5. 5. Web Client Clinet Side Server Side Dispatcher & Router OPTION ページは自身を構 成し、それが表現Resource Client になりクライアン トに返ります。 サーバー内クライアント RES Resource A Page Resource RES Resource B RES RES Representation (View) RES Resource C RES リソース内に ビューを持ち、リ ソースは状態から 表現に変わりま PUSH
    6. 6. Web CLI API Service Clinet Side Socket HTTP Another App GET PUT POST DELETE HEAD OPTIONS HTTP Verb Server Side Dispatcher & Router リソースは自身を OPTION 構成するために必 要あれば他のリ App Resource ソースをリクエス トします。Resource Client GET app://self/user/friend?user_id=1 サーバー内クライアント GET page://self/user?id=1 App Resource GET PUT POST DELETE GET app://self/user/profile?user_id=1 GET app://self/user?id=1 リソースはHTTP 動詞とURIで繋が RES App Resource れています Page Resource RES Representation (View) RES GET POST PUT HTTP Resource X Resource FIle Resource OPTION Another App A Resource Another App B Resource PUSH
    7. 7. 表示レイヤから処理を開始し、必要に応じて複数のコントローラからの処理の結果を“プル”する Framework Architecture PULL
    8. 8. Web Client Clinet Side Server Side Dispatcher & Router OPTION Resource A Resource B RES RES Resource C RES RES View RES RESHTML PHP Doc DBViewにはリソースのプレースフォルダだけがあります。 それをトリガーに リソースがPULLリ クエストされま す。 CMSやRIA、JS MVC等と親和性が 高いのではないで しょうか。 PULL
    9. 9. Resource
    10. 10. Resource Client GET app://self/user?id=1 USER “User” Resource User Page GET app://self/friend?user_id=1 FRIEND “Friend” Resourceこのユーザーペー リソースは単数またジは2つのアプリ は複数のリソースでケーションリソー 構成されますが、クスで構成されてい ライアントには構成ます。 がわかりません リソースの関係はリ Resource Client クエストで表す事が それぞれのリクエ ???? できます。 ストは自身のス ロットに格納され ました。 USER FRIEND
    11. 11. Resource Client GET app://self/user?id=1 User Page User Resource USER [‘name’=>‘koriym’, ‘status’=>’OK’]ユーザーページはリソースクライアントか ユーザーリソースは状らみたらサービスです Representation State 態を持ち、その状態をが、ユーザーリソース リソース表現状態の移動 表現にしてリクエストに対してはクライアン もとに移動(返)され Transferトです これが ます。 ユーザーページが ユーザーリソースを REpresentation State Transfer 利用する関係は 固定 RESTです。 されリクエストに関 わらず不変です。
    12. 12. USER1 GET app://self/user?id=1 User Page or USER2 [‘name’=>‘koriym’, ‘status’=>’OK’] observe外部へのリクエストは自身のスロットに格納します。方法は2つあ リクエスト、あるいは リクエストハンドラーります。 リクエスト結果です。 は、ページが仕事を終 える(自身を構成す る)のを持ってます。 Req Handler 次は彼の出番だからで す。
    13. 13. CQRS NEWS GET app://self/news/top 実行 LOGIN GET app://self/login/current/user ACL適用しなくては AD GET app://self/ad/weekly/rotation これはキャッシュあるはず Top Page POST app://self/footprint/counter?inc=1 これはページ表示後でいいや PUT app://self/log/user/ua これはキューにいれる POST app://self/ntry/new GET用のビューを今すぐつくるページは自身を構成 リクエストハンドラーすることだけに専念 はURIやコンテキストします。 でそのリクエストをど ういう風に実行するか を判断しながらページまず、ページは他のリ Req Handler をインスタンス(実ソースリクエストを 体)にします。持った構造=リソース withグラフです。 Injectable URI Router Test ? Stage ?
    14. 14. NEWS インスタンス(実体) LOGIN インスタンス(実体) AD リクエスト Top Page 後は単純な出力スク 出現するかしないか リプトがテンプレート テンプレートが決める にまとめてアサインしリクエストハンドラは からまだ分からないの て出力するだけです。必要な仕事をして、ほ 一部残っているのは です。とんどのリクエストが ビューに出現したタイ結果(インスタンス) ミングでリクエストをに変わりました。 if (! 有料ユーザー) { 行うLazy Requestリ {$ad} ソースでしょう。 } こういうテンプレート かもしれません。
    15. 15. Script File http://www.grrinninbear.com.au/vet/vsb_cartoons/0403_02Cartoons.html
    16. 16. スクリプトファイル• 最上位の構成をスクリプトで記述• 大きな粒度のスクリプト• 素のPHPを参考に• グローバル変数使用
    17. 17. Native PHP Script 10年前のPHPを思い出そう スクリプトとは読み込 んだだけで実行される 台本(Script) ページの構成をスクリ プトファイルで構成し 簡易な記述で手順がか ていました。 いてあります。include header.php; 大きな粒度でスクリ プトを追加削除できinclude sub_header.php; た。つまり ユーザーinclude menu.php; は自由にページの構include body.php; 造を構成できましinclude footer.php; 問題はそれぞれのスク リプト内の勝手なグ ローバル化する変数 ではその問題を解決し や、ステート。共通の て、フレームワーク全 フレームを持たない 体構造をスクリプトで 事。 記述でき、ユーザーが 構成できるようになれ ばどうでしょうか?
    18. 18. スクリプトファイル web// Application$app = App::factory($runMode, $useCache); ページリソースをHTMLと して出力します// Route// Dispatchlist($method, $pagePath, $query) = (new Router)->match($globals);// Requesttry { $page = $app->resource->$method->uri(page://self/ .$pagePath)->withQuery($query)->eager->request();} catch (Exception $e) { $page = $app->exceptionHandler->handle($e);}// Transfer$app->response->setResource($page)->render()->prepare()->send();
    19. 19. スクリプトファイル API このスクリプトはリ ソースをWeb APIとし て出力します。try { list($method, $query) = (new Router)->getMethodQuery($globals); list($resource, $page) = (new Dispatcher($app))->getInstance($uri); // Request $page = $app->resource->$method->object($page)->withQuery($globals[_GET])->eager->request();} catch (Exception $e) { $page = $app->exceptionHandler->handle($e);}$app->response->setResource($page)->render()->prepare()->send();
    20. 20. Dependency Injection
    21. 21. DI• インターフェイスに依存• オブジェクトの取得は基本しない• するならインジェクトされた専用ファ クトリで• Google Guice スタイルのアノテー ションベースのインジェクション
    22. 22. Object DI dependency A Value dependency B $injector->getInstance(‘nametoservice’); AInjector B module インジェクターはオブ ジェクトを取得すると Service きに、そのオブジェク トが必要(依存)なイ ンスタンスがインジェ クト(注入)します。
    23. 23. Object DI dependency A Value dependency B $injector->getInstance(‘nametoservice’); AInjector A dependency A B moduleインジェクターにセットされた「モ B Service dependency Bジュール」は、注入のルールを知っていま 最も単純で、最も使われす。 るルールは特定のイン ターフェイスが指定され たら、特定のクラスで生 成したインスタンスを注 入するというものですと いうものです。
    24. 24. Injectable Module モジュールにはアプリ ケーションの全ての依 存がセットされていま す。Injector module A モジュールは交換可能です。 他のアプリのモジュールに 入れ替えると、他のアプリ のリソースが利用できま す。 つまり同じ/userリソースで も違うDBの依存を用いま module B す。複数のアプリケーショ ンのリソースが同じインスタ ンスで使えます。
    25. 25. DI @Inject インジェクトが欲しい ところに@Injectと マークします。/** * @param Resource $resource Resource Client * * @Inject */public function __construct(Resource $resource){ タイプヒントはクラス $this->resource = $resource; 名でなくインターフェ イスまたは抽象クラス を指定します。
    26. 26. DI Binding このModuleではイン Moduleクラスは ターフェイスに対応す configureという、た るクラスを設定してい だ一つのメソッドを持 ます。 ち、そこにバイディン グDSLを書きます。protected function configure(){ $this->bind(BEARResourceResource)->to(BEARResourceClient); $this->bind(BEARResourceInvokable)->to(BEARResourceInvoker); $this->bind(BEARResourceLinkable)->to(BEARResourceLinker);} Google GuiceのBindingのサブセットが 用意されています。 詳しくはRay.Diのマニュアルを http://code.google.com/p/rayphp/
    27. 27. Life Cycle /** 初期化は * @PostConstruct @PostConstructメ */ ソッドで指定します。 public function onInit() { .../** * @PreDestory */ 終了処理は@PreDestoroyメ ソッドで指定します。 public function onEnd() { http://en.wikipedia.org/ wiki/JSR_250
    28. 28. DI Injected Factory そのページで必要なコ 生成時のアノテーショ /** ンストラクションは全 ンやバインディング、 * @param Resource てキャッシュされま $resource Resource インジェクトのコスト Client * す。 がキャッシュ後はかか りません。 * @Inject */ public function __construct(Resource $resource) { $this->resource = $resource; $this->greeting = $resource->newInstance(app://self/greeting); オブジェクトの生成は リクエストよらず不変 です。
    29. 29. Scope Scopeアノテーション でsingletonか毎回生 /** 成されるprototypeを * Singleton Service 指定することができま す。 * * @Scope(“singleton”) */$this->bind(RayDiMockDbInterface) モジュールでもシング->to(RayDiMockDb) ルトン指定できます。->in(Scope::SINGLETON);
    30. 30. オブジェクトは他のオブジェクトを必要とし ページリソースを1つます。その他のオブ 取得したらすべてが連ジェクトも違うオブ 鎖取得され巨大なオブジェクトを必要としま ジェクトグラフがつくす。 られます
    31. 31. これは全てがインジェクト済みのHelloWorldアプリです。 これをUnserializeす るだけでこういうグラ フが得られます。 so far so goodです がまだまだ調べます。
    32. 32. Resource Request
    33. 33. Resource Request• リソースにはURIがあります• DSLでリクエスト• 名前引き数で• メソッドはHTTP準拠• 様々なリクエスト方法
    34. 34. Message passing in PHPClient Service $service->read(1, 2) インスタンスを指定 順番で引数を指定普通のPHPでのメソッド呼び出しです。 メソッド名を指定 足りない引数があると... 1) 宣言部のデフォルトが補完 2) Service内で取得する クライアントで引数を えるの が基本です。
    35. 35. Message passing in BEARClient Service $resource ->get 制限されたリクエストメソッド ->uri(‘app://self/service’) URI ->withQuery([‘item’ => 1, quantity =>2]) 名前付クエリー ->eager ”すぐに” ->request(); EOR (end of request) webサービスをリクエ ストするようにリクエ ストします。
    36. 36. Eager Request 挨拶リソースにGETリ クエストをしていま その結果を自分自身の す。 greetingというスロッ トに保存しています。 eagerではリクエストpublic function onGet($lang) 結果が得られます{ $this[greeting] = $this->resource ->get $this[ greeting ]は ->uri(‘app://self/greeting) $this->body[ greeting ]の ->withQuery([lang => $lang]) ショートカットです。 ->eager 引き数は変数名で指定して います。 ->request();
    37. 37. Lazy Request eagerが無いとリクエ スト結果だけではな く、リクエストそのも このリクエストはリク のがスロットに入りま エストハンドラーが行 す。 うか、ビューで出現し たタイミングで行うか はこのスクリプトではpublic function onGet($lang) 指定しません。{ このリソースをキャッ シュしてもリクエスト $this[greeting] = $this->resource 先のリソースは正しく ->get greetingというスロッ 反映されるのに注目し ->uri(‘app://self/greeting) トに挨拶リソースのリ てください。 ->withQuery([lang => $lang]) クエストがセットされ ただけです。 結果でなくリクエスト ->request(); 方法をキャッシュする からです。 リクエストはGET app://self/greering? lang=$langという文 字列表現ができます。
    38. 38. Query Provider クエリーの不足があれpublic function onGet($id) ば、クエリープロバイ{ ダーが活躍します。 日付の分からないカレ ンダーリソースが $this[greeting] = $this->resource ビューに現れる → ->get @Providesで日付リ ->uri(‘app://self/user) ソースに問い合わせ日 付を得て表示 ->withQuery([id => $id]) この例ではユーザーid ->request(); この場合、ビューに最 が指定されないリクエ} ストがあれば 初に日付を用意する責 任がありません。プロ/** provideIdメソッドが その足りない引き数を バイダで呼ばれる日付 * @Provides("id") リソースがその責任を 用意します。 */ これはメソッドの呼 負います。public function provideId() び出しの反転が可能 引き数の注入です。制{ になります。 御が反転しています。 return $_SESSION[user_id];}
    39. 39. Injectable Resource$schemeCollection = new SchemeCollection;$schemeCollection->scheme(app) リソースのURIに応じて 呼び出される処理系->host(self) (リソースアダプ URIには実装の指定が なく「ユーザーの問題->toAdapter(new App); ター)は固定されてい 空間の言語」というこ ません。全てインジェ とができます。 クションされます。$schemeCollection->scheme(page)->host(self) app://self/userが実施にDB->toAdapter(new Page); 元々固定された実装がない なのかmysqlなのかクライア ためモックオブジェクト相当 ントは区別しません。 の機能は容易に実現できま す。
    40. 40. Return $this リクエストされたリ ソースは自身(リソー スオブジェクト)を構 成した後、自身を返し ます。public function onGet($lang){ $this[‘greeting’] = $this->message[$lang]; return $this;} もしリソースオブジェ クト以外がreturnされ リソースクライアント れば、その値をbody はいつもリソースオブ にしたリソースオブ ジェクトが返る事が期 ジェクトが返ります。 待できます。
    41. 41. Sync Request sync requestはリソー スリクエストをまとめ 実際の処理はスキーマ て扱う仕組みです。 によって変わります。 HTTPリソースでは同public function onGet($lang) 時リクエストを行いま す。{ $response = $this->resource ->get->uri($uri1)->eager->sync->request() ->get->uri($uri2)->eager->sync->request() ->get->uri($uri3)->eager->sync->request() ->get->uri($uri4)->eager->eager->request();}
    42. 42. Resource Link• リソースはリンク可能です• リソース間の関係をクライアントでは なくリソース側が持ちます• Aタグのイメージです。関係性はカプセ ル化されクリックしただけで関連リ ソースにジャンプできます。
    43. 43. Resource LinkSelf リソースはリンクする ことができます。 この例ではユーザーリpublic function onGet($lang) ソースからプロファイ{ ルリソースにリンクし $this[greeting] = $this->resource ています。 ->get linkSelfでリンクされ ->uri(‘app://self/user) ているので元のリンク ->withQuery([id => $id]) は失われクライアント HTMLのAタグで別の ->linkSelf(‘profile’) はプロファイルリソー ページに進んだイメー スだけが取得されま ->request(); す。 ジです。 <a target= _self >
    44. 44. Resource LinkNew linkNewのリンクは元public function onGet($lang) のリンクとリンク先の リソースを合成して取{ 得します。 $this[greeting] = $this->resource ->get ->uri(‘app://self/user) ブラウザで複数の windowを開くイメー ->withQuery([id => $id]) ジです。 ->linkNew(‘friend’) ->linkNew(‘profile’) <a target= _blank > ->request();
    45. 45. Resource LinkCrawl linkCrawlはbot(ク ローラー)のイメージpublic function onGet($lang) です。{ $this[greeting] = $this->resource ->get ->uri(‘app://self/entry) ->withQuery([id => $id]) 1:nの関係のリソース ->linkCrawl(‘comment’) のリンクの順をたどり ツリー構造のリソース ->linkCrawl(‘review’) グラフを取得します。 ->request();
    46. 46. Aspect Oriented Programing
    47. 47. アスペクト指向• 横断的関心事 を扱います• メソッドインターセプター• アノテーションで指定
    48. 48. メソッドインターセ プターはメソッドを のっとり(インター セプトして)他の付随 的な処理(ログやト ログやトランザクショ ランザクション)と合 ンなどクロスカッティ わせて行います。 ングコンサーン(横断 Timer Start 的関心事)とコアコン サーン(本質的関心 事)を分離します。 Validation Transaction beginBusiness Logic A Business Logic B Business Logic C Commit ? Rollback ? Log Post Filter Timer Stop
    49. 49. @Aspect アスペクト指向を適用 するクラスに/** @Aspectとマークし ます * * @Aspect */class Aop extends AbstractObject{ /** * @Log @Logはメソッドイン */ ターセプターを指定し public function onGet($lang) ています。 { ...
    50. 50. MethodInterceptor Ray.AopはAOPアラ/** イアンスのインター * @Log Interceptor フェイスの一部を実装 したアスペクト指向フ * レームワークです。 */class Log implements MethodInterceptor{ public function invoke(MethodInvocation $invocation) { $result = $invocation->proceed(); オリジナルメソッド実行 $class = get_class($invocation->getThis()); $input = $invocation->getArguments(); $input = json_encode($input); $result .= PHP_EOL . "[Log] target = $class, input =$input, result = $result" . PHP_EOL; オリジナルメソッドの実行 return $result; 結果を編集しています }
    51. 51. @Log Ray.AopはAOPアラ イアンスのインター フェイスの一部を実装 したアスペクト指向フ レームワークです。protected function configure(){ $interceptors =[new Log]; インターセプターを(複数)指定。 $this->registerInterceptAnnotation(Log, $interceptors); @Logアノテーションとして 登録しています。
    52. 52. Hypermedia as the Engine of Application State
    53. 53. HATEOAS • =Hypermedia as the Engine of 状態遷移 Application State (状態マシンを ハイパーメディアで表現する) • 状態遷移がハイパーリンクで得られるhttp://www.infoq.com/jp/articles/webber-rest-workflow
    54. 54. rel linkpublic function onGet($drink) リソース間の関係をリ{ ソース側が持っていま 注文を済まして、支払に す。 $order = $this->resource 状態が変わっています。 ->post ->uri(app://self/RestBucks/Order) ->withQuery([drink => $drink])->eager->request(); $paymentUri = $order->links[payment]; 注文の結果、「支払のURI」がヘッダーから得られました。 $payment = array(credit_card_number => 123456789, リソースは自己記述的name => John Citizen, amount => 4.00); です。 $this[payment] = $this->resource リソースはクライアン ->put トを気にせず関係性を ->uri($paymentUri) 変更できます。 ->addQuery($payment)->request(); つまり注文と支払の関係はリソースが持っていて クライアントにその知識は必要ありません。

    ×