Your SlideShare is downloading. ×
BEAR.Sunday Note
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

BEAR.Sunday Note

3,229
views

Published on

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

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

Published in: Technology

0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,229
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
5
Comments
0
Likes
5
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
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
  • Transcript

    • 1. BEAR.Sunday Note rev 08
    • 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. Apache Tapestry Apache Click CMS PUSH Framework Architecture PULL Ruby On Rails DjangoSymfony / CakePHP
    • 4. PUSH処理を要求するアクションを実行し、次に結果を出力するためにデータを表示のレイヤに“プッシュ”する。
    • 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. 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. 表示レイヤから処理を開始し、必要に応じて複数のコントローラからの処理の結果を“プル”する Framework Architecture PULL
    • 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. Resource
    • 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. 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. USER1 GET app://self/user?id=1 User Page or USER2 [‘name’=>‘koriym’, ‘status’=>’OK’] observe外部へのリクエストは自身のスロットに格納します。方法は2つあ リクエスト、あるいは リクエストハンドラーります。 リクエスト結果です。 は、ページが仕事を終 える(自身を構成す る)のを持ってます。 Req Handler 次は彼の出番だからで す。
    • 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. NEWS インスタンス(実体) LOGIN インスタンス(実体) AD リクエスト Top Page 後は単純な出力スク 出現するかしないか リプトがテンプレート テンプレートが決める にまとめてアサインしリクエストハンドラは からまだ分からないの て出力するだけです。必要な仕事をして、ほ 一部残っているのは です。とんどのリクエストが ビューに出現したタイ結果(インスタンス) ミングでリクエストをに変わりました。 if (! 有料ユーザー) { 行うLazy Requestリ {$ad} ソースでしょう。 } こういうテンプレート かもしれません。
    • 15. Script File http://www.grrinninbear.com.au/vet/vsb_cartoons/0403_02Cartoons.html
    • 16. スクリプトファイル• 最上位の構成をスクリプトで記述• 大きな粒度のスクリプト• 素のPHPを参考に• グローバル変数使用
    • 17. Native PHP Script 10年前のPHPを思い出そう スクリプトとは読み込 んだだけで実行される 台本(Script) ページの構成をスクリ プトファイルで構成し 簡易な記述で手順がか ていました。 いてあります。include header.php; 大きな粒度でスクリ プトを追加削除できinclude sub_header.php; た。つまり ユーザーinclude menu.php; は自由にページの構include body.php; 造を構成できましinclude footer.php; 問題はそれぞれのスク リプト内の勝手なグ ローバル化する変数 ではその問題を解決し や、ステート。共通の て、フレームワーク全 フレームを持たない 体構造をスクリプトで 事。 記述でき、ユーザーが 構成できるようになれ ばどうでしょうか?
    • 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. スクリプトファイル 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. Dependency Injection
    • 21. DI• インターフェイスに依存• オブジェクトの取得は基本しない• するならインジェクトされた専用ファ クトリで• Google Guice スタイルのアノテー ションベースのインジェクション
    • 22. Object DI dependency A Value dependency B $injector->getInstance(‘nametoservice’); AInjector B module インジェクターはオブ ジェクトを取得すると Service きに、そのオブジェク トが必要(依存)なイ ンスタンスがインジェ クト(注入)します。
    • 23. Object DI dependency A Value dependency B $injector->getInstance(‘nametoservice’); AInjector A dependency A B moduleインジェクターにセットされた「モ B Service dependency Bジュール」は、注入のルールを知っていま 最も単純で、最も使われす。 るルールは特定のイン ターフェイスが指定され たら、特定のクラスで生 成したインスタンスを注 入するというものですと いうものです。
    • 24. Injectable Module モジュールにはアプリ ケーションの全ての依 存がセットされていま す。Injector module A モジュールは交換可能です。 他のアプリのモジュールに 入れ替えると、他のアプリ のリソースが利用できま す。 つまり同じ/userリソースで も違うDBの依存を用いま module B す。複数のアプリケーショ ンのリソースが同じインスタ ンスで使えます。
    • 25. DI @Inject インジェクトが欲しい ところに@Injectと マークします。/** * @param Resource $resource Resource Client * * @Inject */public function __construct(Resource $resource){ タイプヒントはクラス $this->resource = $resource; 名でなくインターフェ イスまたは抽象クラス を指定します。
    • 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. Life Cycle /** 初期化は * @PostConstruct @PostConstructメ */ ソッドで指定します。 public function onInit() { .../** * @PreDestory */ 終了処理は@PreDestoroyメ ソッドで指定します。 public function onEnd() { http://en.wikipedia.org/ wiki/JSR_250
    • 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. Scope Scopeアノテーション でsingletonか毎回生 /** 成されるprototypeを * Singleton Service 指定することができま す。 * * @Scope(“singleton”) */$this->bind(RayDiMockDbInterface) モジュールでもシング->to(RayDiMockDb) ルトン指定できます。->in(Scope::SINGLETON);
    • 30. オブジェクトは他のオブジェクトを必要とし ページリソースを1つます。その他のオブ 取得したらすべてが連ジェクトも違うオブ 鎖取得され巨大なオブジェクトを必要としま ジェクトグラフがつくす。 られます
    • 31. これは全てがインジェクト済みのHelloWorldアプリです。 これをUnserializeす るだけでこういうグラ フが得られます。 so far so goodです がまだまだ調べます。
    • 32. Resource Request
    • 33. Resource Request• リソースにはURIがあります• DSLでリクエスト• 名前引き数で• メソッドはHTTP準拠• 様々なリクエスト方法
    • 34. Message passing in PHPClient Service $service->read(1, 2) インスタンスを指定 順番で引数を指定普通のPHPでのメソッド呼び出しです。 メソッド名を指定 足りない引数があると... 1) 宣言部のデフォルトが補完 2) Service内で取得する クライアントで引数を えるの が基本です。
    • 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. 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. 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. 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. 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. Return $this リクエストされたリ ソースは自身(リソー スオブジェクト)を構 成した後、自身を返し ます。public function onGet($lang){ $this[‘greeting’] = $this->message[$lang]; return $this;} もしリソースオブジェ クト以外がreturnされ リソースクライアント れば、その値をbody はいつもリソースオブ にしたリソースオブ ジェクトが返る事が期 ジェクトが返ります。 待できます。
    • 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. Resource Link• リソースはリンク可能です• リソース間の関係をクライアントでは なくリソース側が持ちます• Aタグのイメージです。関係性はカプセ ル化されクリックしただけで関連リ ソースにジャンプできます。
    • 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. 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. 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. Aspect Oriented Programing
    • 47. アスペクト指向• 横断的関心事 を扱います• メソッドインターセプター• アノテーションで指定
    • 48. メソッドインターセ プターはメソッドを のっとり(インター セプトして)他の付随 的な処理(ログやト ログやトランザクショ ランザクション)と合 ンなどクロスカッティ わせて行います。 ングコンサーン(横断 Timer Start 的関心事)とコアコン サーン(本質的関心 事)を分離します。 Validation Transaction beginBusiness Logic A Business Logic B Business Logic C Commit ? Rollback ? Log Post Filter Timer Stop
    • 49. @Aspect アスペクト指向を適用 するクラスに/** @Aspectとマークし ます * * @Aspect */class Aop extends AbstractObject{ /** * @Log @Logはメソッドイン */ ターセプターを指定し public function onGet($lang) ています。 { ...
    • 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. @Log Ray.AopはAOPアラ イアンスのインター フェイスの一部を実装 したアスペクト指向フ レームワークです。protected function configure(){ $interceptors =[new Log]; インターセプターを(複数)指定。 $this->registerInterceptAnnotation(Log, $interceptors); @Logアノテーションとして 登録しています。
    • 52. Hypermedia as the Engine of Application State
    • 53. HATEOAS • =Hypermedia as the Engine of 状態遷移 Application State (状態マシンを ハイパーメディアで表現する) • 状態遷移がハイパーリンクで得られるhttp://www.infoq.com/jp/articles/webber-rest-workflow
    • 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(); つまり注文と支払の関係はリソースが持っていて クライアントにその知識は必要ありません。