系統開發懶人大絕招: GeneralAPI
前言:
繼上一篇提到,將Controller, Model, Repository的命名統一之後
我們可以得到一個非常簡單的Create流程
| 
					 1 2 3 4  | 
						public function create(Request $request): Model {     return $this->repo->create(new $this->__dto__(...$request->json())); }  | 
					
而我們做系統,最常遇到的不外乎Create , Update, Delete, Read 四種資料流程了
因此我們更近一步的除了Create以外,也把其他流程做完,並且包含在BaseController中,也就成了一個GenenralApi了
怎麼做:
依照上面的邏輯,我們統整如下
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19  | 
						public function create(Request $request): Model {     return $this->repo->create(new $this->__dto__(...$request->validated())); } public function read_list(ReadListRequest $request): LengthAwarePaginator|Collection {     return $this->repo->read_models(new $this->__dto__(...$request->validated())); } public function update(Request $request): Model {     return $this->repo->update(new $this->__dto__(...$request->validated())); } public function delete(Request $request): array {     $this->repo->delete_model($request->json()->get('id')); }  | 
					
可以發現,基本上就是呼叫repository中預先定義好的方法,然後傳入該有的Dto資訊
為了方便管理,我們將以上寫成Traits,大概像這樣子
| 
					 1 2 3 4 5 6 7  | 
						trait GeneralApi {     public function create(Request $request): Model     public function read_list(ReadListRequest $request): LengthAwarePaginator|Collection     public function update(Request $request): Model     public function delete(Request $request): array }  | 
					
然後在BaseController中引用進來
| 
					 1 2 3 4  | 
						class BaseController extends Controller {     use GeneralApi; }  | 
					
這樣一來,所有繼承了這個BaseController的Controller都已經擁有預設的CRUD Api邏輯了
如果照上一篇的範例來看,我的CustomerController幾乎不用寫,只要extend BaseController即可
例外的調整怎麼辦 :
寫到這邊一定有人會說,哪有可能這麼剛好每一個api都只要寫入資料就可以
是的,沒有錯當然事情不會這麼簡單,我們還是舉CustomerController為例
當今天要新增一筆客戶資料的時候,需要多做額外的商業邏輯可以怎麼做呢?
| 
					 1 2 3 4 5 6 7 8 9 10 11  | 
						class CustomerController extends BaseController {     public function create(Request $request): Model     {         //這裡寫其他需要處理的邏輯         //$payload = ...........         $request->replace($payload);         return parent::create($request);     } }  | 
					
答案就是,覆寫就可以了,這個範例覆寫了create function,在這個之中可以客製化的描述所需要的邏輯
最後,將處理完要入庫的資料放在$payload中,replace回$request
最後一行,我們還是呼叫parent::create來做入庫的動作
這樣一來,無論需要做到多複雜的邏輯CRUD基本上就已經做完

