laravel 制作通用的curd 后台操作

[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 这几个方法几乎都是一样的,所以可以抽取这些方法的共性来提升我们的代码可复用性。

前置条件:
  1. 所有的model都需要设置fillable这个属性,至于为什么,后面说
  2. 所有的controller的模型验证都是通过request类来进行验证的
  3. 建立通用的curd trait
改造后的代码:
  1. 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'];//此处必须设置
}
  1. 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'
        ];
    }
}
  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);
    }
}
  1. 改造后的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时打印的数据:

image.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值