2018-05-30 開催の「第126回 PHP勉強会@東京」におけるLT資料です
https://phpstudy.doorkeeper.jp/events/74677
Laravel×レイヤードアーキテクチャをやってみている話第126回 PHP勉強会@東京
View Slide
岡田 正平(おかだ しょうへい)@okashoi• 株式会社ウィルゲート 2015年新卒入社• 開発室 ソリューションユニット 所属• PHP, Laravel, Vue.js2自己紹介Slides:
• これまで CakePHP で開発してきたが、今回はじめて Laravel を採用• 技術のキャッチアップ• チームを越えられる人材育成• 別チームで Laravel をメインに使っていた私 に白羽の矢が立つ3背景|とあるチームの新規開発プロジェクト
4背景|とあるチームの新規開発プロジェクトプロジェクトリーダー実装者 2 名 インフラ担当• 別チームから兼任(稼動の 40%)• 実装方針の策定• Laravel の知見伝搬するマン
自分が提供できる価値を考える「チームはわざわざ『Laravel に切り替える』というコストを払っている……」
自分が提供できる価値を考える「なのに Laravel をただの MVC フレームワークとして使うのではメリットが薄いよね?」
「レイヤードアーキテクチャやろう」
8レイヤードアーキテクチャ?出典:DDDパターンを活用した Laravelアプリケーション開発/ddd-with-laravelhttps://speakerdeck.com/shin1x1/ddd-with-laravel(めちゃくちゃ参考にさせてもらってます )
9レイヤードアーキテクチャ※DDD(ドメイン駆動設計)と一緒に語られることが多いが今回は DDD はやっていないDomain 層はプレーンな PHP オブジェクトで実装Laravel 固有の知識・実際のデータ形式の情報などはApplication, Infrastructure 層に寄せていく
• Laravel 固有の知識がビジネスロジックに漏れ出ない(=関心の分離)• 例)Eloquent ORM の記述は Infrastructure 層で完結している• Laravel の ServiceContaner と相性がいい(後述)10うまくいっている点
出典:DDDパターンを活用した Laravelアプリケーション開発/ddd-with-laravelby shin1x1https://speakerdeck.com/shin1x1/ddd-with-laravel?slide=4011うまくいっている点|Laravel との相性の良さ
• ServiceProvider 内(UserImageRepository は interface)• 利用箇所(環境に依存しないコードになる)• DI になっているのでテストも書きやすい!12うまくいっている点|Laravel との相性の良さif (app()->environment('production') || app()->environment('staging')) {// 本番環境・ステージング環境のみ、S3 に保存$this->app->bind(UserImageRepository::class, S3UserImageRepository::class);} else {// それ以外はローカルファイルストレージに保存$this->app->bind(UserImageRepository::class, LocalUserImageRepository::class);}public function __construct(UserRepository $userRepository, UserImageRepository $userImageRepository){$this->userRepository = $userRepository;$this->userImageRepository = $userImageRepository;}
• class 数が多くなるので煩雑に感じがち• 勘所を掴むまでは極端すぎるくらいでもいいかな、とも• うまく集約が使いこなせていない感• User という Domain Model のコンストラクタの引数が 26 個に• ユーザ名、性別、プロフィール画像、email などなど……13悩んでいる点
• 今後、ビジネスロジックが増えてきたときにDomain 層に寄せていくようにチームの意識をすり合わせていく• 運用保守も始まったときに考え方が守られるかどうか➢ 個人が考え、チームで議論できる土台・文化づくり14これから