打造 Laravel 優美架構
談可維護性與彈性設計
LaravelConf Taiwan 2017
逸軒(Yish)
Laravel 台灣固定班底
@yishlai
Mombuyish
Laravel 原始架構
Middleware
Controller
HTTP REQUEST
View
Model/Eloquent
Response
View
渲染畫面、畫面最終輸出結果
Controller
接口呼叫方法、回傳結果
Model
Relations、Scope 與 Eloquent 類的方法
Response
回傳指定資料格式
看起來很好,But
多人協作時
每個人定義不同
在 Route 寫 query or response
在 controller 寫驗證、商業邏輯、查詢操作
他們總有一個共同的理由
反正可以動
圖片來源自網路
後果
超難維護
圖片來源自網路
如果一個專案很多人共同維護
就必須要有規範
逐步改善,加入規範
目標
Repository
Eloquent / DB 操作資源庫
將查詢放到 Repository 讓修改與測試更容易
Middleware
Controller
HTTP REQUEST
View
Model/Eloquent
Response
Repository
現實總沒那麼單純
文章建立
商業流程放 Service
Service
放置商業邏輯與流程
Repository
Service
Middleware
Controller
HTTP REQUEST
View
Model/Eloquent
Response
需求
發文時通知
訂閱者有新文章
不會影響到查詢邏輯和回傳結果
前台頁面
格式轉換
不能修改查詢與商業流程
僅能影響外觀顯示
前台顯示性別要中文
你也許會想到⋯
Accessors / Mutators
很方便,但渲染外觀這件事給 Model?
圖片來源自網路
是要讓 Model 腫起來嗎?
它負責的事情已經夠多了
Service Injection
Presenter
轉換渲染顯示
Presenter
Repository
Service
Middleware
Controller
HTTP REQUEST
View
Model/Eloquent
Response
前後端分離
有個接口是取得
所有 user 資料
等等!我只需要
名字跟 email 就好
改 Repository 查詢欄位?
可是瑞凡
我後台要看到所有資料啊
在 Response 前必須作轉換處理
Transformer
轉換資料
Transformer
Presenter
Repository
Service
Middleware
Controller
HTTP REQUEST
View
Model/Eloquent
Response
需求
加入總使用者數
API 回傳格式都不統一?
讓資料 response 前都經過制定格式
Formatter
制定格式
Transformer
Presenter
Repository
Service
Middleware
Controller
HTTP REQUEST
View
Model/Eloquent
Response
Formatter
文章要有Emoji 功能
Foundation
獨立運行方法/掛載功能
Transformer
Presenter
Repository
Service
Middleware
Controller
HTTP REQUEST
View
Model/Eloquent
Response
Formatter
Foundation
Q1
每個專案都要這樣用?
Q2
做法是如何產生的?
總結
共識
職責單一
和夥伴們一起取得共識、良好的溝通。
每個類只會有一種改變的理由。
One more thing
$ composer require yish/generators
https://github.com/Mombuyish/Laravel-Oh-Generators
Providing
指令建立上面設計方法
Abstract Service, Repository
Transformer, Formatter contracts, Helpers
Statusable for formatter
$ php artisan make:service UserService
$ php artisan make:repository UserRepository
$ php artisan make:transformer UserTransformer
$ php artisan make:formatter UserFormatter
$ php artisan make:presenter UserPresenter
Thank you for listening.
Q&A