0%

【Day-23】改造MVC - Controller(概念篇)

文章同步於it邦

前言

今天要來講講改造MVC的Controller
雖然沒有DDD這種架構如此乾淨,但依然是不少人使用的架構

起因

這就要先講講為甚麼要改造controller
前面介紹了那麼多軟體設計、架構的原則
我們可以清楚知道說將所有Code一拖拉庫往Controller塞,會造成沒有辦法撰寫單元測試
根據單一職責原則,我們就必須要把Controller職責過多的狀況改善

範例

假設我今天有一個會員要註冊的API,我把驗證、登入邏輯全部寫再一起

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class MemberController extends Controller
{
public function store(Request $request)
{
// 驗證請求參數
$validatedData = $request->validate([
'member_name' => 'required|string|min:1|max:60',
'member_email' => 'required|string|email|max:255|unique:members', // 確保email在資料庫中唯一
'member_password' => 'required|string|max:255',
]);

// 在資料庫中建立會員資料
try {
$member = Member::create([
'member_name' => $validatedData['member_name'],
'member_email' => $validatedData['member_email'],
'member_password' => $validatedData['member_password'],
]);

// 成功建立資料,回傳201 Created狀態碼
return response()->json(['message' => '會員資料建立成功'], 201);
} catch (\Exception $e) {
// 發生錯誤,回傳錯誤訊息
return response()->json(['message' => '會員資料建立失敗'], 500);
}
}
}

光只是兩個非常基礎的流程就搞到Controller如此大一包了,如果未來還要加入活動,什麼名字裡面有鮭魚就送鮭魚的這種判斷條件也寫進去,那真的是不得了

而且這樣寫也沒有人知道驗證跟資料庫那一層是否正確

拆法

我們先重新定義Controller的職責,不管我的業務邏輯是甚麼,我始終只會讓Controller去取得需要的資訊最後傳給前端
那為了這件是我是必要把責任分擔出去
根據上述的條件,我會如此的拆分我的Controller
Controller依賴

也就是說,我的Controller是依賴其他層級的原件,那到時候要修改我就會直接把底下的部分抽換掉就好
在這個狀況下,我也可以針對每一個功能去進行單元測試,清楚的了解哪邊有問題

參考資料

Day 01: 【序】– 架構與設計、代碼、工程師
打造 Laravel 優美架構
DAY6 - 你的 Backend 可以更有彈性一點 - Clean Architecture 概念篇
go-clean-arch