打造 Laravel 優美架構
談可維護性與彈性設計
LaravelConf Taiwan 2017
逸軒(Yish)Laravel 台灣固定班底
@yishlai
Mombuyish
Middleware
ControllerHTTP REQUEST
View
Model/Eloquent
Response
Controller接口呼叫方法、回傳結果
ModelRelations、Scope 與 Eloquent 類的方法
在 Route 寫 query or response
在 controller 寫驗證、商業邏輯、查詢操作
他們總有一個共同的理由
反正可以動
後果
超難維護
● 先了解做的那個人思考過程● 他的想法● 功能要做什麼● 沒有 Test Case (重點)● 跟觀落陰沒有兩樣
如果一個專案很多人共同維護
就必須要有規範
RepositoryEloquent / DB 操作資源庫
將查詢放到 Repository 讓修改與測試更容易
Middleware
ControllerHTTP REQUEST
View
Model/Eloquent
Response
Repository
Repository
Service
Middleware
ControllerHTTP REQUEST
View
Model/Eloquent
Response
不能修改查詢與商業流程僅能影響外觀顯示
前台顯示性別要中文
你也許會想到⋯Accessors / Mutators
很方便,但渲染外觀這件事給 Model?
是要讓 Model 腫起來嗎?它負責的事情已經夠多了
Service Injection
Presenter
Repository
Service
Middleware
ControllerHTTP REQUEST
View
Model/Eloquent
Response
有個接口是取得所有 user 資料
等等!我只需要名字跟 email 就好
改 Repository 查詢欄位?
在 Response 前必須作轉換處理
Transformer
Presenter
Repository
Service
Middleware
ControllerHTTP REQUEST
View
Model/Eloquent
Response
讓資料 response 前都經過制定格式
Transformer
Presenter
Repository
Service
Middleware
ControllerHTTP REQUEST
View
Model/Eloquent
Response
Formatter
Foundation獨立運行方法/掛載功能
Transformer
Presenter
Repository
Service
Middleware
ControllerHTTP REQUEST
View
Model/Eloquent
Response
Formatter
Foundation
總結
共識和夥伴們一起取得共識、良好的溝通。
職責單一每個類只會有一種改變的理由。
$ composer require yish/generators
https://github.com/Mombuyish/Laravel-Oh-Generators
Providing指令建立上面設計方法
Abstract Service, Repository
Transformer, Formatter contracts, Helpers
Statusable for formatter
● Generating Service
$ php artisan make:service UserService
● Generating Repository
$ php artisan make:repository UserRepository
● Generating Transformer
$ php artisan make:transformer UserTransformer
● Generating Formatter
$ php artisan make:formatter UserFormatter
● Generating Presenter
$ php artisan make:presenter UserPresenter
Thank you for listening.