系統開發懶人大絕招: 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基本上就已經做完