打造Laravel 優美架構

69
打造 Laravel 優美架構 談可維護性與彈性設計 LaravelConf Taiwan 2017

Transcript of 打造Laravel 優美架構

打造 Laravel 優美架構

談可維護性與彈性設計

LaravelConf Taiwan 2017

逸軒(Yish)Laravel 台灣固定班底

@yishlai

Mombuyish

● 原始架構

● 問題

● 改善

Laravel 原始架構

Middleware

ControllerHTTP REQUEST

View

Model/Eloquent

Response

View渲染畫面、畫面最終輸出結果

Controller接口呼叫方法、回傳結果

ModelRelations、Scope 與 Eloquent 類的方法

Response回傳指定資料格式

看起來很好,But

多人協作時每個人定義不同

在 Route 寫 query or response

在 controller 寫驗證、商業邏輯、查詢操作

他們總有一個共同的理由

反正可以動

圖片來源自網路

後果

超難維護

● 先了解做的那個人思考過程● 他的想法● 功能要做什麼● 沒有 Test Case (重點)● 跟觀落陰沒有兩樣

圖片來源自網路

如果一個專案很多人共同維護

就必須要有規範

逐步改善,加入規範目標

RepositoryEloquent / DB 操作資源庫

將查詢放到 Repository 讓修改與測試更容易

Middleware

ControllerHTTP REQUEST

View

Model/Eloquent

Response

Repository

現實總沒那麼單純

文章建立

● 加入標籤

商業流程放 Service

Service放置商業邏輯與流程

Repository

Service

Middleware

ControllerHTTP REQUEST

View

Model/Eloquent

Response

需求發文時通知訂閱者有新文章

不會影響到查詢邏輯和回傳結果

前台頁面格式轉換

不能修改查詢與商業流程僅能影響外觀顯示

前台顯示性別要中文

你也許會想到⋯Accessors / Mutators

很方便,但渲染外觀這件事給 Model?

圖片來源自網路

是要讓 Model 腫起來嗎?它負責的事情已經夠多了

Service Injection

Presenter轉換渲染顯示

Presenter

Repository

Service

Middleware

ControllerHTTP REQUEST

View

Model/Eloquent

Response

前後端分離

有個接口是取得所有 user 資料

等等!我只需要名字跟 email 就好

改 Repository 查詢欄位?

可是瑞凡我後台要看到所有資料啊

在 Response 前必須作轉換處理

Transformer轉換資料

Transformer

Presenter

Repository

Service

Middleware

ControllerHTTP REQUEST

View

Model/Eloquent

Response

需求加入總使用者數

API 回傳格式都不統一?

讓資料 response 前都經過制定格式

Formatter制定格式

Transformer

Presenter

Repository

Service

Middleware

ControllerHTTP REQUEST

View

Model/Eloquent

Response

Formatter

文章要有Emoji 功能

Foundation獨立運行方法/掛載功能

Transformer

Presenter

Repository

Service

Middleware

ControllerHTTP 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

● 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.

Q&A