:::

15-6 建立Request來做資料整理及檢查

  1. 儲存時要驗證,未來修改時也是要驗證,那是否可以統一驗證?才不用到處都寫驗證規則?而且還可以讓控制器保持乾乾淨淨?可以,善用表單請求類(request)即可。詳情可見:https://laravel-china.org/docs/laravel/5.6/validation/1372
  2. 建立 request
    php artisan make:request CartRequest
  3. 會產生\專案\app\Cart.phpauthorize()部份是用來判別目前登入者是否有權限執行此動作(驗證後要執行的動作,也就是加入購物車的動作),這裡可先填入 true,以免無法使用使用購物車。

    public function authorize()
    {
        return true;
    }
    
  4. 再將原先規則搬入rules()中。

    public function rules()
    {
        return [
            'product_id' => [
                'required',
                function ($attribute, $value, $fail) {
                    if (!$product = Product::find($value)) {
                        return $fail('該商品不存在');
                    }
                    if (!$product->on_sale) {
                        return $fail('該商品未上架');
                    }
                },
            ],
            'amount' => ['required', 'integer', 'min:1'],
        ];
    }
  5. 若需要自訂訊息,只要新增一個messages函數,並將自訂訊息移入即可。
    public function messages()
    {
        return [
            'required' => '請選擇商品',
            'min'      => '「:attribute」至少要 :min 個',
        ];
    }
  6. 若是想替欄位命名則可利用attribute來進行設定

    public function attributes()
    {
        return [
            'amount' => '商品數量',
        ];
    }
  7. 修改 /專案/app/Http/Controllers/CartController.php 控制器,修改 store$request 的類別改用 CartRequest,並將原本在裡面的驗證拿掉。

    public function store(CartRequest $request)
    {
        Cart::create($request->all());
        return redirect()->route('cart.index');
    }
  8. 在上方加入使用我們自製的 CartRequest

    use App\Http\Requests\CartRequest;
  9. 修改\專案\resources\views\product\add2cart.blade.php模板:
    $('.btn-add-to-cart').click(function () {
        console.log($(this).data('id') + ' = ' + $('input[name=amount]').val());
        axios.post('{{ route('cart.store') }}', {
            product_id: $(this).data('id'),
            amount: $('input[name=amount]').val(),
        })
        .then(function () { // 請求成功時執行:
            swal('加入購物車成功', '', 'success');
        }, function (error) { // 請求失敗時執行:
    
            console.log('error.response.status = ' + error.response.status);
            if (error.response.status === 422) {
                var html = '<div>';
                _.each(error.response.data.errors, function (errors) {
                    _.each(errors, function (error) {
                        html += error + '<br>';
                    })
                });
                html += '</div>';
                swal({content: $(html)[0], icon: 'error'})
            } else if(error.response.status === 500) {
                swal('系統錯誤', '', 'error');
            }
    
            @guest
                swal('請先登入', '', 'error');
            @endguest
        })
    });
    

    在 Laravel 裡輸入參數校驗不通過拋出的異常所對應的 Http 狀態碼是 422,具體錯誤信息會放在返回結果的 errors 陣列裡,所以這裡我們通過 error.response.data.errors 來拿到所有的錯誤信息。最後把所有的錯誤信息拼接成 Html 代碼並彈框告知用戶。

  10. 日後若有 update 時,也是比照辦理即可,無須在控制器裡面寫驗證。
    public function update(CartRequest $request, $id)
    {
        //
    }

 

到GitHub觀看此單元程式異動  


:::

書籍目錄

展開 | 闔起

http%3A%2F%2Fcampus-xoops.tn.edu.tw%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbdsn%3D1444

計數器

今天: 2771277127712771
昨天: 1988198819881988
總計: 7389662738966273896627389662738966273896627389662