[TOC]
在后台简单的单表操作,我们一般会像下面这样执行curd:
改造前的controller文件
<?php
namespace App\Http\Controllers\Admin;
use App\Entity\Carmodel;
use App\Entity\Washfee;
use App\Entity\Washtype;
use App\Http\Requests\Admin\WashFeeRequest;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class WashFeesController extends Controller
{
public function index()
{
}
public function create(){
return view('admin.washFees.create');
}
public function store(WashFeeRequest $washFeeRequest)
{
$data = [
'car_id' => $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文件
<?php
namespace App\Entity;
use Illuminate\Database\Eloquent\Model;
class AuthGroup extends Base
{
protected $table = 'auth_group';
protected $fillable = ['title','description','status','rules','deleted_at'];//此处必须设置
}
- request文件
<?php
namespace App\Http\Requests\Admin;
use Illuminate\Foundation\Http\FormRequest;
class AuthGroupRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
$authGroup = $this->route('authGroup');
return [
'title' => 'required|min:2|unique:auth_group,title,' . $authGroup['id'] . ',id',
'description' => 'nullable',
'status' => 'between:0,1'
];
}
}
- 新增加的commonCurd文件
<?php
namespace App\Http\Controllers\Admin;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Http\FormRequest;
trait CommonCURD
{
public function commonUpdate(FormRequest $request, Model $model)
{
//循环model的fillable,如果request存在该键,则更新
foreach ($model->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文件,我用了另一个文件演示改造后的代码
<?php
namespace App\Http\Controllers\Admin;
use App\Entity\AuthGroup;
use App\Http\Requests\Admin\AuthGroupRequest;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class AuthGroupsController extends Controller
{
use CommonCURD;//引入trait
public function index()
{
}
public function create()
{
$title = '用户组';
return view('admin.authGroups.create', compact('title'));
}
public function store(AuthGroupRequest $authGroupRequest)
{
//改造后代码
$this->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时打印的数据:

可以看到原始数据和修改后的数据,并且没有提交的数据是不变的(有些字段在表单里面没有)
网友评论