SlideShare una empresa de Scribd logo
1 de 48
Descargar para leer sin conexión
Laravel
×
レイヤードアーキテクチャ
を実践して得られた知見と反省
Japan PHP Conference 2018
@okashoi WILLGATE, Inc.
岡田 正平(おかだ しょうへい)@okashoi
• 株式会社ウィルゲート
• PHP, Laravel, Vue.js
• Golang はじめました
2
自己紹介
Slides:
Services Tech Blog Events
ブログやってます!イベントやってます!
「ウィルゲート テックブログ」で検索!
4
今年の phpcon のテーマ = “GROWTH”
今日の目標:私たちの失敗を共有すること
• 人や組織は「失敗」によって成長する
• 成功には再現性はないが、失敗には再現性がある
➢ 私が携わった 2 つのプロジェクトについて
具体的な事例、特に失敗を共有し
皆さんの糧にしてもらいたい
5
今年の phpcon のテーマ = “GROWTH”
今回は「具体的にどのような実装になるか」
という話(※)はほとんど出てきません
※またどこか別の機会を得て話したい
• 背景
• Laravel とレイヤードアーキテクチャの親和性
• 失敗したこと
• おわりに
7
目次
• 背景
• Laravel とレイヤードアーキテクチャの親和性
• 失敗したこと
• おわりに
8
目次
プロジェクト A
• 2018 年 4 月~
• Laravel で HTML を render して返す
典型的な web アプリケーション
• PL + 実装者 2 名 +
プロジェクト B
• 2018 年 6 月~
• SPA(API を Laravel で実装)
• PM + フロント 3 名 + サーバサイド 4 名 +
9
2 つのプロジェクト
• いずれも実装者のほとんどが Laravel 未経験
• なぜ Laravel?
• 技術のキャッチアップのため
• チーム横断人材の育成のため
• の役割はアプリケーションアーキテクト
• 別チームで Laravel をメインで使っていたので
白羽の矢が立った
10
2 つのプロジェクト
※ 2018 年 3 月ごろ
「チームはわざわざ『Laravel に切り替える』
というコストを払っている……」
11
自分が提供できる価値を考える
※ 2018 年 3 月ごろ
「Laravel をただの MVC フレームワークとして
使うのでは得られるものが少ないのでは?」
12
自分が提供できる価値を考える
かくして、チームを巻き込んだ
レイヤードアーキテクチャへの
試行錯誤の旅が始まった
• 背景
• Laravel とレイヤードアーキテクチャの親和性
• 失敗したこと
• おわりに
14
目次
• ディレクトリ構成を自由に設定できる
• DI のための仕組みが充実
• Eloquent ORM などの豊富で強力な機能
15
Laravel の特徴
• ディレクトリ構成を自由に設定できる
• DI のための仕組みが充実
• Eloquent ORM などの豊富で強力な機能
16
Laravel の特徴
→レイヤードアーキテクチャと相性がいい
→どこまでその機能を活用するか悩ましい
• もとから Laravel に存在している
概念は該当する層の中に移動
• 依存性の逆転を発生させる際に
DI の仕組みを活用
17
自由なディレクトリ構成と DI の仕組み
• もとから Laravel に存在している
概念は該当する層の中に移動
• 依存性の逆転を発生させる際に
DI の仕組みを活用
18
自由なディレクトリ構成と DI の仕組み
Application
Infrastructure
Domain
処理の流れ 依存の方向
出典: DDDパターンを活用したLaravelアプリケーション開発
/ddd-with-laravel
https://speakerdeck.com/shin1x1/ddd-with-laravel
(めちゃくちゃ参考にしました 感謝 )
19
参考にさせていただいたもの
• 背景
• Laravel とレイヤードアーキテクチャの親和性
• 失敗したこと
• おわりに
20
目次
失敗 1
Value Object
が形骸化した
本来の意図
値の振る舞いや制約をオブジェクトで表現する
• 例)「価格」 Value Object
• マイナス値を取らない
• 消費税込みの金額を算出できる など
実際に起きたこと
全カラムと 1 対 1 のクラスを作ることが目的に
➢ ロジックの無いクラスが大量生産される
22
Value Object の形骸化
<?php
namespace App¥Domain¥Models¥News;
/**
* Class Title
*/
class Title
{
/**
* @var string
*/
private $value;
/**
* @param string $value
*/
public function __construct(string $value)
{
$this->value = $value;
}
/**
* @return string
*/
public function value(): string
{
return $this->value;
}
}
このようなクラスが
DB のカラムの数だけ
作成された
どうすればよかったか?
• Value Object に「どんなメリットがあるか」
をベースにしてメンバーの認識すり合わせる
• 振る舞いや制約がない値は Value Object にしない
• 自由入力形式のテキストや bool 値など
24
Value Object の形骸化
失敗 2
Domain 層に
整形処理を書いた
json API の実装において Entity や Value Object に
を実装
26
整形処理の実装箇所
class User implements ¥JsonSerializable
{
// 略
public function jsonSerialize(): array
{
return [
'id' => $this->id,
'mail_address' => $this->mailAddress,
'profile' => [
'last_name' => $this->lastName,
'first_name' => $this->firstName,
'user_name' => $this->userName,
'sex' => $this->sex,
],
];
}
}
{
"id": 1,
"mail_address": "john@example.org",
"profile": {
"last_name": "Doe",
"first_name": "John",
"user_name": "johndoe",
"sex": "male"
}
}
jsonSerialize()
Controller が薄く、はじめは良い実装に見えた
27
整形処理の実装箇所
class UserController extends Controller
{
public function detail(User $user)
{
return response(['user' => $user]);
}
public function create(CreateRequest $request, UserRepository $userRepository)
{
$user = $userRepository->create($request->validated());
return response(['user' => $user], 201);
}
public function update(User $user, UpdateRequest $request, UserRepository $userRepository)
{
$user = $userRepository->update($user->id(), $request->validated());
return response(['user' => $user], 200);
}
}
• 一方で「ユーザ一覧 API」では
次のようなレスポンス欲しくなった
• 対応するために Entity に という
プロパティをもたせて条件分岐させるようにした
➢ ドメインの関心ごと以外が混ざってしまった
28
整形処理の実装箇所
{
"users": [
{"id": 1, "user_name": "jonedoe"},
{"id": 2, "user_name": "janedoe"},
// ...
]
}
$requestType
どうすればよかったか? その 1
• そもそも整形処理(レスポンス形式)自体が
ドメインの関心ごとではない
➢ Application 層に整形を担う
Presenter のようなクラスを設置する
• 「Controller を薄くすること」を目的にしない
• あくまで 1 つの指標に過ぎない
29
整形処理の実装箇所
どうすればよかったか? その 2
• CQRS を適用する
• 副作用のある Command と
副作用のない Query で役割を分割する
➢ 「一覧取得」は Query で行い
Entity を経由せずに、連想配列の形で扱ってしまう
30
整形処理の実装箇所
失敗? 3
作るシステムの
規模を考慮しなかった
プロジェクト A の場合
• 最初のリリースまでに 3 ヶ月程度
• リリース後に大きな追加開発はしない想定
• 一般に公開はしないクローズドなシステム
➢ システムの規模に対してクラスの種類が多く
機能実装のオーバーヘッドが大きくなっていたの
ではないか?
32
規模に見合ったアーキテクチャか?
33
規模に見合ったアーキテクチャか?
MVC レイヤードアーキテクチャ
• routing
• Controller (Request)
• Model (ORM)
• View
• routing
• Controller (Request)
• Use Case
• Entity
• Value Object
• Domain Service
• Repository (Interface)
• Repository (Implementation)
• ORM
• View
MVC と比較して考慮するべき概念は増える
レイヤードアーキテクチャのメリット(私的解釈)
• MVC をもう少し詳細に分割・責務を明確化
(”Model” が指すものは人によってまちまち)
➢ コードの可読性が保たれる中長期的なメリット
• 「依存性の逆転」を活用して
ドメイン知識を何にも依存させない(保護する)
➢ 複雑な問題を扱うシステムほどその効果が大きい
34
規模に見合ったアーキテクチャか?
どうすればよかったか?
• 複雑でないシステムなら MVC でも充分
• レイヤードアーキテクチャに出てくる概念の
一部だけを適用するのも良い
• 一方で、この挑戦によって得られた知見が
たくさんあった事実も軽視できない
➢ これらを踏まえて、ステークホルダーの合意を
取ったうえで採用するのならば問題はない
(今回は合意を取っていた)
35
規模に見合ったアーキテクチャか?
失敗? 4
ドメインモデリングと
設計が分かれていた
• いずれも実装者のほとんどが Laravel 未経験
• なぜ Laravel?
• 技術のキャッチアップのため
• チーム横断人材の育成のため
• の役割はアプリケーションアーキテクト
• 別チームで Laravel をメインで使っていたので
白羽の矢が立った
37
再掲:2 つのプロジェクト
• 別チームからの兼任なので
サービスや業務フローへの理解が浅い状態
• アプリケーションアーキテクトとしての参加で
要件定義には参加していない
• 一度要件に落とされたものをベースに設計
➢ 伝言ゲーム形式になって
本質を突いた設計になっているかがわからない
38
モデリングと設計の分離
どうすればよかったか?
• レイヤードアーキテクチャの恩恵を
存分に受けたければドメイン知識の理解は必須
• 理解が深い者が設計を行う
• 設計者が理解を深める
• ただし、実装パターンとして適用するだけでも
受けられる恩恵はあるので無意味とはいえない
• テストコードが書きやすい
• プルリクの粒度が小さくなった? など
39
モデリングと設計の分離
• 背景
• Laravel とレイヤードアーキテクチャの親和性
• 失敗したこと
• おわりに
40
目次
レイヤードアーキテクチャの採用は正解だったのか?
41
おわりに
レイヤードアーキテクチャの採用は正解だったのか?
(現時点では)正直わからない......
➢ その設計が「良かった」かどうかは
数年後になって初めて判断できるようになる
42
おわりに
「設計として」正解かどうかはわからない
だけど
取り組んだことそれ自体は
正解にすることができる
(やったからには、何が何でも正解にしたい)
43
おわりに
• メンバーに Laravel の知識や
レイヤードアーキテクチャの概念を伝搬する
• 試行錯誤の過程で生まれたドキュメント等を
組織の資産にする
• (失敗)事例は外に向けてアウトプットする
➢ 自分/組織/社会の成長の糧にする
44
やったからには余すこと無く価値に変える
• メンバーに Laravel の知識や
レイヤードアーキテクチャの概念を伝搬する
• 試行錯誤の過程で生まれたドキュメント等を
組織の資産にする
• (失敗)事例は外に向けてアウトプットする
➢ 自分/組織/社会の成長の糧にする
45
やったからには余すこと無く価値に変える
今日、この場でお話ししているのも
「取り組んだことそれ自体」を正解にするため
46
さて、今年の phpcon のテーマは?
47
さて、今年の phpcon のテーマは?
挑戦して
その結果を発信して
みんなで”成長”しましょう
来年の phpcon で
お待ちしています!

Más contenido relacionado

La actualidad más candente

オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
 

La actualidad más candente (20)

Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
Grafana Dashboards as Code
Grafana Dashboards as CodeGrafana Dashboards as Code
Grafana Dashboards as Code
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
 
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
Solrで多様なランキングモデルを活用するためのプラグイン開発 #SolrJP
Solrで多様なランキングモデルを活用するためのプラグイン開発 #SolrJPSolrで多様なランキングモデルを活用するためのプラグイン開発 #SolrJP
Solrで多様なランキングモデルを活用するためのプラグイン開発 #SolrJP
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門
 
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
 
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したこと
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
 
Reinventing the Transaction Script (NDC London 2020)
Reinventing the Transaction Script (NDC London 2020)Reinventing the Transaction Script (NDC London 2020)
Reinventing the Transaction Script (NDC London 2020)
 

Similar a Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered architecture

Google App Engine for Java
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for Java
Takuya Tsuchida
 
20110714 j queryベーシック
20110714 j queryベーシック20110714 j queryベーシック
20110714 j queryベーシック
良太 増子
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門
Sho A
 

Similar a Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered architecture (20)

Ecmascript2015とその周辺について
Ecmascript2015とその周辺についてEcmascript2015とその周辺について
Ecmascript2015とその周辺について
 
Visualforce + jQuery
Visualforce + jQueryVisualforce + jQuery
Visualforce + jQuery
 
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
 
ScalaMatsuri 2016
ScalaMatsuri 2016ScalaMatsuri 2016
ScalaMatsuri 2016
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
 
私とOSS活動とPerl
私とOSS活動とPerl私とOSS活動とPerl
私とOSS活動とPerl
 
Google App Engine for Java
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for Java
 
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピングpi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
 
ウェブから情報をあつめる
ウェブから情報をあつめるウェブから情報をあつめる
ウェブから情報をあつめる
 
<第1回>Laravelハンズオンセミナー
<第1回>Laravelハンズオンセミナー<第1回>Laravelハンズオンセミナー
<第1回>Laravelハンズオンセミナー
 
20110714 j queryベーシック
20110714 j queryベーシック20110714 j queryベーシック
20110714 j queryベーシック
 
CodeIgniterによるPhwittr
CodeIgniterによるPhwittrCodeIgniterによるPhwittr
CodeIgniterによるPhwittr
 
TypeScript と Visual Studio Code
TypeScript と Visual Studio CodeTypeScript と Visual Studio Code
TypeScript と Visual Studio Code
 
React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門React.jsでクライアントサイドなWebアプリ入門
React.jsでクライアントサイドなWebアプリ入門
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門
 
Vue.js で XSS
Vue.js で XSSVue.js で XSS
Vue.js で XSS
 
Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
 
LaravelでAPI定義を管理する
LaravelでAPI定義を管理するLaravelでAPI定義を管理する
LaravelでAPI定義を管理する
 
実践 NestJS
実践 NestJS実践 NestJS
実践 NestJS
 

Más de Shohei Okada

Más de Shohei Okada (20)

「登壇しているひとは偉い」という話
「登壇しているひとは偉い」という話「登壇しているひとは偉い」という話
「登壇しているひとは偉い」という話
 
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしようPHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
 
PHP 8.0 の新記法を試してみよう!
PHP 8.0 の新記法を試してみよう!PHP 8.0 の新記法を試してみよう!
PHP 8.0 の新記法を試してみよう!
 
自分たちのコードを Composer パッケージに分割して開発する
自分たちのコードを Composer パッケージに分割して開発する自分たちのコードを Composer パッケージに分割して開発する
自分たちのコードを Composer パッケージに分割して開発する
 
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #shuuumai
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #shuuumaiクリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #shuuumai
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #shuuumai
 
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawa
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawaクリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawa
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpconokinawa
 
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpcondo
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpcondoクリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpcondo
クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #phpcondo
 
Laravel でやってみるクリーンアーキテクチャ #phpconfuk
Laravel でやってみるクリーンアーキテクチャ #phpconfukLaravel でやってみるクリーンアーキテクチャ #phpconfuk
Laravel でやってみるクリーンアーキテクチャ #phpconfuk
 
エラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyo
エラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyoエラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyo
エラー時にログに出力する情報と画面に表示する情報を分ける #LaravelTokyo
 
スペシャリストとして組織をつくる、というキャリア
スペシャリストとして組織をつくる、というキャリアスペシャリストとして組織をつくる、というキャリア
スペシャリストとして組織をつくる、というキャリア
 
PHP でも活用できる Makefile
PHP でも活用できる MakefilePHP でも活用できる Makefile
PHP でも活用できる Makefile
 
はじめての Go 言語のプロジェクトを AWS Lambda + API Gateway でやったのでパッケージ構成を晒すよ
はじめての Go 言語のプロジェクトを AWS Lambda + API Gateway でやったのでパッケージ構成を晒すよはじめての Go 言語のプロジェクトを AWS Lambda + API Gateway でやったのでパッケージ構成を晒すよ
はじめての Go 言語のプロジェクトを AWS Lambda + API Gateway でやったのでパッケージ構成を晒すよ
 
働き方が大きく変わった 入社3年目のときのとあるエピソード
働き方が大きく変わった 入社3年目のときのとあるエピソード働き方が大きく変わった 入社3年目のときのとあるエピソード
働き方が大きく変わった 入社3年目のときのとあるエピソード
 
Laravel で API バージョニングを実装するなら
Laravel で API バージョニングを実装するならLaravel で API バージョニングを実装するなら
Laravel で API バージョニングを実装するなら
 
Laravel における Blade 拡張のツラミ
Laravel における Blade 拡張のツラミLaravel における Blade 拡張のツラミ
Laravel における Blade 拡張のツラミ
 
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかLaravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのか
 
2017 年度を振り返って ~アウトプット編~
2017 年度を振り返って ~アウトプット編~2017 年度を振り返って ~アウトプット編~
2017 年度を振り返って ~アウトプット編~
 
Laravel × レイヤードアーキテクチャをやってみている話
Laravel × レイヤードアーキテクチャをやってみている話Laravel × レイヤードアーキテクチャをやってみている話
Laravel × レイヤードアーキテクチャをやってみている話
 
Laravel 5.6 デフォルトの例外ハンドリング処理をまとめてみた
Laravel 5.6 デフォルトの例外ハンドリング処理をまとめてみたLaravel 5.6 デフォルトの例外ハンドリング処理をまとめてみた
Laravel 5.6 デフォルトの例外ハンドリング処理をまとめてみた
 
チームで「きちんと」Laravel を使っていくための取り組み
チームで「きちんと」Laravel を使っていくための取り組みチームで「きちんと」Laravel を使っていくための取り組み
チームで「きちんと」Laravel を使っていくための取り組み
 

Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered architecture