laravel 制作通用的curd 后臺(tái)操作

[TOC]
在后臺(tái)簡(jiǎn)單的單表操作薪铜,我們一般會(huì)像下面這樣執(zhí)行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 = '創(chuàng)建失敗';
        }else{
            $msg = '創(chuàng)建成功';
        }
        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();
    }
}

我們發(fā)現(xiàn)所有的單表操作里面蜘腌,store\update\destroy 這幾個(gè)方法幾乎都是一樣的,所以可以抽取這些方法的共性來(lái)提升我們的代碼可復(fù)用性彼妻。

前置條件:

  1. 所有的model都需要設(shè)置fillable這個(gè)屬性仰挣,至于為什么饭于,后面說(shuō)
  2. 所有的controller的模型驗(yàn)證都是通過(guò)request類(lèi)來(lái)進(jìn)行驗(yàn)證的
  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'];//此處必須設(shè)置
}
  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)
    {
        //循環(huán)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 = '創(chuàng)建失敗';
        }else{
            $msg = '創(chuàng)建成功';
        }
        session()->flash('msg',$msg);
    }

    public function commonDestroy(Model $model)
    {
        if (!$model->delete()) {
            $msg = '刪除失敗';
        } else {
            $msg = '刪除成功';
        }
        session()->flash('msg', $msg);
    }
}
  1. 改造后的controller文件儿倒,我用了另一個(gè)文件演示改造后的代碼
<?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 = '用戶(hù)組';
        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 = '用戶(hù)組';
        return view('admin.authGroups.edit', compact('title', 'authGroup'));
    }

    public function update(AuthGroupRequest $authGroupRequest, AuthGroup $authGroup)
    {  
        //改造后的代碼呜笑,如果該model屬性多的話(huà)可以減少很多的代碼量
        $this->commonUpdate($authGroupRequest, $authGroup);
        return redirect()->route('authGroups.index');
    }

    public function destroy(AuthGroup $authGroup)
    {
        $this->commonDestroy($authGroup);
        return redirect()->route('authGroups.index');
    }
}

下面是我在提交update時(shí)打印的數(shù)據(jù):


image.png

可以看到原始數(shù)據(jù)和修改后的數(shù)據(jù)夫否,并且沒(méi)有提交的數(shù)據(jù)是不變的(有些字段在表單里面沒(méi)有)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市叫胁,隨后出現(xiàn)的幾起案子凰慈,更是在濱河造成了極大的恐慌,老刑警劉巖驼鹅,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件微谓,死亡現(xiàn)場(chǎng)離奇詭異森篷,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)堰酿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)疾宏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人触创,你說(shuō)我怎么就攤上這事坎藐。” “怎么了哼绑?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵岩馍,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我抖韩,道長(zhǎng)蛀恩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任茂浮,我火速辦了婚禮双谆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘席揽。我一直安慰自己顽馋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布幌羞。 她就那樣靜靜地躺著寸谜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪属桦。 梳的紋絲不亂的頭發(fā)上熊痴,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音聂宾,去河邊找鬼果善。 笑死,一個(gè)胖子當(dāng)著我的面吹牛系谐,可吹牛的內(nèi)容都是我干的岭埠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蔚鸥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了许赃?” 一聲冷哼從身側(cè)響起止喷,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎混聊,沒(méi)想到半個(gè)月后弹谁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年预愤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沟于。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡植康,死狀恐怖旷太,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情销睁,我是刑警寧澤供璧,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站冻记,受9級(jí)特大地震影響睡毒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冗栗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一演顾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧隅居,春花似錦钠至、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至乒融,卻和暖如春掰盘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赞季。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工愧捕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人申钩。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓次绘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親撒遣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子邮偎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348