1 of 69

打造 Laravel 優美架構

談可維護性與彈性設計

LaravelConf Taiwan 2017

2 of 69

逸軒(Yish)

Laravel 台灣固定班底

@yishlai

Mombuyish

3 of 69

  • 原始架構
  • 問題
  • 改善

4 of 69

Laravel 原始架構

5 of 69

Middleware

Controller

HTTP REQUEST

View

Model/Eloquent

Response

6 of 69

View

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

7 of 69

Controller

接口呼叫方法、回傳結果

8 of 69

Model

Relations、Scope 與 Eloquent 類的方法

9 of 69

Response

回傳指定資料格式

10 of 69

看起來很好,But

11 of 69

多人協作時

每個人定義不同

12 of 69

在 Route 寫 query or response

13 of 69

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

14 of 69

他們總有一個共同的理由

反正可以

15 of 69

圖片來源自網路

16 of 69

後果

維護

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

17 of 69

圖片來源自網路

18 of 69

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

就必須要有規範

19 of 69

逐步改善,加入規範

目標

20 of 69

Repository

Eloquent / DB 操作資源庫

21 of 69

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

22 of 69

Middleware

Controller

HTTP REQUEST

View

Model/Eloquent

Response

Repository

23 of 69

現實總沒那麼單純

24 of 69

文章建立

  • 加入標籤

25 of 69

商業流程放 Service

26 of 69

Service

放置商業邏輯與流程

27 of 69

Repository

Service

Middleware

Controller

HTTP REQUEST

View

Model/Eloquent

Response

28 of 69

需求

發文時通知

訂閱者有新文章

29 of 69

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

30 of 69

前台頁面

格式轉換

31 of 69

32 of 69

不能修改查詢與商業流程

僅能影響外觀顯示

前台顯示性別要中文

33 of 69

你也許會想到⋯

Accessors / Mutators

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

34 of 69

圖片來源自網路

35 of 69

是要讓 Model 起來嗎?

它負責的事情已經夠多了

36 of 69

37 of 69

Service Injection

38 of 69

Presenter

轉換渲染顯示

39 of 69

Presenter

Repository

Service

Middleware

Controller

HTTP REQUEST

View

Model/Eloquent

Response

40 of 69

前後端分離

41 of 69

有個接口是取得

所有 user 資料

42 of 69

43 of 69

等等!我只需要

名字跟 email 就好

44 of 69

改 Repository 查詢欄位?

45 of 69

可是瑞凡

我後台要看到所有資料啊

46 of 69

在 Response 前必須作轉換處理

47 of 69

48 of 69

Transformer

轉換資料

49 of 69

Transformer

Presenter

Repository

Service

Middleware

Controller

HTTP REQUEST

View

Model/Eloquent

Response

50 of 69

需求

加入總使用者數

51 of 69

52 of 69

API 回傳格式都不統一

53 of 69

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

54 of 69

55 of 69

Formatter

制定格式

56 of 69

Transformer

Presenter

Repository

Service

Middleware

Controller

HTTP REQUEST

View

Model/Eloquent

Response

Formatter

57 of 69

文章要有Emoji 功能

58 of 69

59 of 69

Foundation

獨立運行方法/掛載功能

60 of 69

Transformer

Presenter

Repository

Service

Middleware

Controller

HTTP REQUEST

View

Model/Eloquent

Response

Formatter

Foundation

61 of 69

Q1

每個專案都要這樣用?

62 of 69

Q2

做法是如何產生的?

63 of 69

總結

共識

職責單一

和夥伴們一起取得共識、良好的溝通。

每個類只會有一種改變的理由。

64 of 69

One more thing

65 of 69

$ composer require yish/generators

https://github.com/Mombuyish/Laravel-Oh-Generators

66 of 69

Providing

指令建立上面設計方法

Abstract Service, Repository

Transformer, Formatter contracts, Helpers

Statusable for formatter

67 of 69

  • 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

68 of 69

Thank you for listening.

69 of 69

Q&A