[TOC]
在后台简单的单表操作,我们一般会像下面这样执行curd:改造前的controller文件
$washFeeRequest->car_id, 'wash_id' => $washFeeRequest->wash_id, 'price' => $washFeeRequest->price, 'create_time' => time(), ]; if (!Washfee::create($data)) { $msg = '创建失败'; }else{ $msg = '创建成功'; } session()->flash('msg',$msg); return redirect()->route('washfees.index'); } public function edit(Washfee $washfee){ return view('admin.washFees.edit',compact('washfee'); } public function update(WashFeeRequest $washFeeRequest, Washfee $washfee) { if ($washFeeRequest->isMethod('PUT')) { $washfee->car_id = $washFeeRequest->car_id; $washfee->wash_id = $washFeeRequest->wash_id; $washfee->price = $washFeeRequest->price; if (!$washfee->save()) { $msg = '修改失败'; }else{ $msg = '修改成功'; } } session()->flash('msg', $msg); return redirect()->route('washfees.index'); } public function destroy(Washfee $washfee) { if (!$washfee->delete()) { $msg = '删除失败'; } else { $msg = '删除成功'; } session()->flash('msg', $msg); return redirect()->back(); }}
我们发现所有的单表操作里面,store\update\destroy 这几个方法几乎都是一样的,所以可以抽取这些方法的共性来提升我们的代码可复用性。
前置条件:
- 所有的model都需要设置fillable这个属性,至于为什么,后面说
- 所有的controller的模型验证都是通过request类来进行验证的
- 建立通用的curd trait
改造后的代码:
- model文件
- request文件
route('authGroup'); return [ 'title' => 'required|min:2|unique:auth_group,title,' . $authGroup['id'] . ',id', 'description' => 'nullable', 'status' => 'between:0,1' ]; }}
- 新增加的commonCurd文件
getFillable() as $key) { if ($request->has($key)) { $model->$key = $request->$key; } } //保存 if (!$model->save()) { $msg = '修改失败'; session()->flash('msg', $msg); } else { $msg = '修改成功'; session()->flash('msg', $msg); } } public function commonStore(FormRequest $request, $model) { $data = []; $m = new $model; foreach($m->getFillable() as $key){ if($request->has($key)){ $data[$key] = $request->$key; } } if (!$model::create($data)) { $msg = '创建失败'; }else{ $msg = '创建成功'; } session()->flash('msg',$msg); } public function commonDestroy(Model $model) { if (!$model->delete()) { $msg = '删除失败'; } else { $msg = '删除成功'; } session()->flash('msg', $msg); }}
- 改造后的controller文件,我用了另一个文件演示改造后的代码
commonStore($authGroupRequest,WashFee::class); return redirect()->route('authGroups.index'); } public function edit(AuthGroup $authGroup) { $title = '用户组'; return view('admin.authGroups.edit', compact('title', 'authGroup')); } public function update(AuthGroupRequest $authGroupRequest, AuthGroup $authGroup) { //改造后的代码,如果该model属性多的话可以减少很多的代码量 $this->commonUpdate($authGroupRequest, $authGroup); return redirect()->route('authGroups.index'); } public function destroy(AuthGroup $authGroup) { $this->commonDestroy($authGroup); return redirect()->route('authGroups.index'); }}
下面是我在提交update时打印的数据:
可以看到原始数据和修改后的数据,并且没有提交的数据是不变的(有些字段在表单里面没有)