0%

【Day-24】改造MVC - Controller(實作篇)

文章同步於it邦

前言

那麼今天直接來實作改造Controller

狀況

假設我今天需要一個註冊會員的功能
我們需要驗證資料、儲存資料、金流和物流以及回傳資料

今天我會先用DI(依賴注入)的方式來撰寫,這個下次有機會再來介紹

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class MemberController extends Controller
{
protected $member_validator;
protected $member_use_case;
protected $member_repository;
protected $member_formatter;

public __construct(MemberValidator $member_validator, MemberUseCase $member_use_case, MemberRepository $member_repository, MemberFormatter $member_formatter)
{
$this->member_validator = $member_validator;
$this->member_use_case = $member_use_case;
$this->member_repository = $member_repository;
$this->member_formatter = $member_formatter;
}

public function registerMember(Request $request)
{
$request_data = $request->data;

// 驗證請求參數
$error_key_group = $this->member_validator->getRegisterMemberErrorKeyGroup($request->data);
if (count(error_key_group) != 0) {
$validate_fail_response_data = $this->$member_formatter->getValidateFailResponseData($error_key_group)
return response()->json($validate_fail_response_data, 400)
}

// 金流和物流
if (!$this->member_use_case->isPaySuccessful($request_data)) {
$pay_fail_response_data = $this->$member_formatter->getPayFailResponseData()
return response()->json($pay_fail_response_data, 400)
}

if (!$this->member_use_case->isGiftSuccessful($request_data)) {
$gift_fail_response_data = $this->$member_formatter->getGiftFailResponseData()
return response()->json($gift_fail_response_data, 400)
}

// 建立資料
try {
$this->member_repository->createMember($request_data);
} catch (\Exception $e) {
$create_data_fail_response_data = $this->$member_formatter->getCreateDataFailResponseData();
return response()->json($create_data_fail_response_data, 400);
}

$success_response_data = $this->$member_formatter->getSuccessResponseData();
return response()->json($success_response_data, 201);
}
}

我們可以得知這個順序是

  1. Request 進入 Controller
  2. Controller 向 Validator 驗證使用者的資料
  3. Controller 向 UseCase 傳遞資料(處理業務邏輯,像是金流物流)
  4. Controller 向 Repository 請求建立資料
  5. Repository 向 Model 請求建立資料
  6. Model 向 DB 建立資料
  7. Controller 向 Formatter 請求回傳資料
  8. Controller 給出 Response

搭配圖大概長這樣
時序圖

這樣我們就可以分別為每一層撰寫單元測試,明天我們再來談這一部分