BEAR (Suday) design
-
Upload
akihito-koriyama -
Category
Technology
-
view
3.160 -
download
0
Transcript of BEAR (Suday) design
PHP 5.3+ /5.4
BEAR (Sunday)
1. namespace
1. namespace
use \coupon\App\Auth as couponAuth;
use \blog\App\Auth as blogAuth;
read ro:://coupon/User?id=1read ro:://blog/User?id=1
2. DI
Say goodbye to BEAR::Dependency()
\BEAR\Di::Container();
Say hello to
コンテナをセット
サービスをセット
Powered
by Aura.
Di
サービスを取得
Dependency Injection the JSR 330 way
一部ですが
標準化されたDIの為のアノテーション
namespace BEARTest\example\App\Log;
/** * BEAR * * @Scope("singleton") */class Log{ /** * Reource * * @Inject * * @var Resource */ private $resource;
/** * Di * * @Inject * * @var Di */ private $di;
/** * Init * * @PostConstruct */ public function onInit() { $this->inited = true; }
/** * @PreDestoroy */ public function onEnd() { }
/** * @Inject * * @param Db $db */ public function setDb(Db $db) { }
/** * @Inject * @Named("user=admin_user,db=test_db") * * @param Db $db * */ public function setDouble(User $user, Db $db) { $this->db = $db; }
@ScopePrototype
Session
Application
Property Injection
Singleton
@Inject
namespace BEARTest\example\App\Log;
/** * BEAR * * @Scope("singleton") */class Log{ /** * Reource * * @Inject * * @var Resource */ private $resource;
/** * Di * * @Inject * * @var Di */ private $di;
/** * Init * * @PostConstruct */ public function onInit() { $this->inited = true; }
/** * @PreDestoroy */ public function onEnd() { }
/** * @Inject * * @param Db $db */ public function setDb(Db $db) { }
/** * @Inject * @Named("user=admin_user,db=test_db") * * @param Db $db * */ public function setDouble(User $user, Db $db) { $this->db = $db; }
@PostConstruct
@PreDestory
Setter Injection
Initialization
@Inject
Finalization
namespace BEARTest\example\App\Log;
/** * BEAR * * @Scope("singleton") */class Log{ /** * Reource * * @Inject * * @var Resource */ private $resource;
/** * Di * * @Inject * * @var Di */ private $di;
/** * Init * * @PostConstruct */ public function onInit() { $this->inited = true; }
/** * @PreDestoroy */ public function onEnd() { }
/** * @Inject * * @param Db $db */ public function setDb(Db $db) { }
/** * @Inject * @Named("user=admin_user,db=test_db") * * @param Db $db * */ public function setDouble(User $user, Db $db) { $this->db = $db; }
@PreDestory
@Named
Setter Injection@Inject
Finalization
2. Annotation
• どのクラスでも利用可能
• ユーザー定義化
• リソースアノテーション
/** * Blog info * * @Template(user.tpl) * @Cache(life=0) * @Pager(item=10) * @Pull(“ro://self/User/Login”) */ public function onRead($values) { $this->set(); }
設定を利用する側から利用される側に
Inversion of Control
@Pullで「制御が反転」「ログイン情報からブログ情報」ではなくて逆になってる
3.More Resource Orientedページもリソースに
App_Main::run($class);
App_Main::run($class);
$params = $di->get(‘params’)->setOption($option);$page = $di->factory('testapp\App\Page\Hello\World');$ro = $di->get('main')->request($page, $params)->getRo();$ro->output();
ページリクエスト
ページリクエスト
の結果もRo
3.Resource Interface
function request(Ro $ro, Params $params)
function output(Ro $ro)
リソース Page
Ro
function request(Ro $ro, Params $params)
リソース Page
Ro
リソース処理はアダプターに委譲
リソースもクライアントもリソースの内部処理には関心がない
function request(Ro $ro, Params $params)
リソース Page
Ro
クライアント
function request(Ro $ro, Params $params)
function output(Ro $ro)
リソース Page
Ro
クライアント
インスタンス
Main
Page
function request(Ro $ro, Params $params)
function output(Ro $ro)
リソース Page
Ro
クライアント
インスタンス
PageAdapter::request(Ro $ro, Params $params);
Main
Page
function request(Ro $ro, Params $params)
function output(Ro $ro)
リソース Page
Ro
クライアント
インスタンス
PageAdapter::request(Ro $ro, Params $params);
Main
Page
Webがモデル。
ApacheもブラウザもPHPを知らないのに注目。
Apache
Webブラウザmod_php
Page
Ro
Main Page Ro
Ro
BrowserGET /User?id=1 request($page, $params); request($ro, $params);
$ro$roHTTP
$ro->output();
pageAdapter::request($page, $params);
roAdapter::request($page, $params);
Resource Interface
read User?id=1
• リソースは「リソース結果を決定する処理」をリソース自身が決定できる。
• =Pageリソースであっても純正Pageアダプター以外の処理でリソース結果を返す事ができる。
4.CQRS
CQRSCommand and Query
Responsibility Segregation
CQS: 「あらゆるメソッドは、アクションを実行するコマンドか、呼び出し元にデータを返すクエリかのいずれかであって、両方を行ってはならない。これは、質問をすることで回答を変化させてはならないということだ。」 -Bertrand Meyer
http://d.hatena.ne.jp/digitalsoul/20100712/1278886009
CQRS + REST = ?
CQS: 「あらゆるメソッドは、アクションを実行するコマンドか、呼び出し元にデータを返すクエリかのいずれかであって、両方を行ってはならない。これは、質問をすることで回答を変化させてはならないということだ。」 -Bertrand Meyer
http://d.hatena.ne.jp/digitalsoul/20100712/1278886009
コマンドクエリ READ
CREATEUPDATEDELETE
ロジックは、可能な限り(副作用なく戻り値を返すような)関数の中に置く。命令は単純な操作として厳密に分離し、ドメイン情報は返さないようにする。
DDD/Side -Effect-Free Functions - Java EE勉強会
変化させてはならないRESTのGETと同じ
Side Effect FREE
CQRS + REST = BEAR
<h2>koriym</h2><ul><li>name: Koriama</li></ul>
RDB (MySQL)
Representation
Resource
Client
COMMANDupdate User?id=1&name=koriym
NoSQLQUERY
read User?id=1
<h2>koriym</h2><ul><li>name: Koriama</li></ul>
それぞれに適したレポジトリに分離する
COMMANDupdate User?id=1&name=koriym
PC用,iPhone用、携帯用、AJAX用、データ用...
Commandはデータの粒度やリレーションに関心がある。
RDB (MySQL)
Client
NoSQLQUERY
read User?id=1
リソース表現はクライアントによって異なり複数存在
Queryは構造に無関心。結合されたキャッシュが読めれば良い。QueryとCommandではデータ構造の関心は異なる
キャッシュの適切な破壊
Commandの実行と同時にQueryデータを作成値だけでなく表現も生成する
5.Compatibility
• Saturday(for 5.2)内蔵「そのまま」でも動く
• ページの混在可能 (=Shared nothing)
• Ro互換モード
• 作法はほとんど変わらず低学習コスト
Compatibility
フロントコントローラがなくサイトは単にページリソースの集合体なので
ページ間が Aタグでしか結ばれていない
できるんでしょうか...を目指したい
6.RealTime$this->set(‘user’, $user, ‘realtime’);
$this->set(‘user’, $user, ‘ajax’);
ニコニコ動画の時報CMやgtalkのようなrealtime性リソースの変化をビューがobserveするGUI的MVC
Powered
by Orbit
ed
7.Multi Language
PHP Page Java Resource
Objective-C Client PHP Resource
Powered
by Thrif
t
言語を超えて祖
結合
8. Online editorfully supported
Powered
by AceEd
itor
design memo athttps://gist.github.com/1111850