laravel / lumen 次の一歩
TRANSCRIPT
Laravel / Lumen 次の一歩ytake / 20150529 Laravel LT at JP
Profile
• ytake (github), ex_takezawa(twitter)
• java, php, node.js, RDBMS, NoSQL, VoltDB
4章を担当させていただきました
Containerなど盛り沢山
Facade Really useful :)
!= GoF Facades
Facadeを利用する上での問題
• static だと思ってしまう。(養成読本をどうぞ!)
• 確かに楽ですが、テストコード正しく書けてますか?
• どこでも簡単に使えるので、非構造化になりがち
Eloquentも同じ
public function getEntries() { $entries = \Entry::all() ->toArray(); if(!count($entries)) { throw new \Exception; } }
$eloquentMock = m::mock(‘overload:App\Repositories\Eloquent\Entry');
$collection = m::mock(‘Illuminate\Database\Eloquent\Collection');
$eloquentMock ->shouldReceive(‘all') ->andReturn($collection);
$collection->shouldReceive(‘toArray') ->andReturn([1, 2, 3]);
次のステップにいくには 構造化を考えることが大事
インターフェース/疎結合
インターフェース 具象クラス
バインド
インターフェース 具象クラス
インターフェース 具象クラス
インターフェース 具象クラス
インターフェース 具象クラス
インターフェース 具象クラス
インターフェース 具象クラス
コンテナ
*イメージ
コンストラクタ・メソッド インジェクションで解決
HogeClass constructor 具象クラス
インターフェース
HogeClass
hogeと名付けようサービスロケータなど
名前 具象クラス
名前 具象クラス
インターフェース 具象クラス
インターフェース 具象クラス
名前 具象クラス
インターフェース 具象クラス
コンテナ
*イメージ
Facade
具象クラスインターフェース 名前
*関連性にアクセスするためのもの
// バインディング $this->app->bind( 'App\Hogeable', 'App\Hoge' ); // 関係性にアクセサ名 $this->app->bind('hoge', function() { return $this->app->make('App\Hogeable'); });
バインドの次は、 Facadeの実クラスを知ること よりテストがしやすく 補完にもやさしい
DB => DatabaseManager
Redirect => Redirector
+ UrlGenerator + RouteCollection
+ Request
概念も分離
DB
リポジトリ
エンティティ
Eloquent / ORM
ストレージ リポジトリ
DBに依存してはならない
HogeClass
リポジトリ
サービスI/F
I/F
Route
formRequest
Controller
beforemiddleware
aftermiddleware
view
Route
formRequestController
beforeafter
view
サービスI/F
リポジトリI/F
dispatch
分離することで見えてくるフレームワーク
本当のLaravelはここから
ご静聴ありがとうございました