:::
15-6 建立Request來做資料整理及檢查
- 儲存時要驗證,未來修改時也是要驗證,那是否可以統一驗證?才不用到處都寫驗證規則?而且還可以讓控制器保持乾乾淨淨?可以,善用表單請求類(request)即可。詳情可見:https://laravel-china.org/docs/laravel/5.6/validation/1372
- 建立 request
php artisan make:request CartRequest -
會產生
\專案\app\Cart.php,authorize()部份是用來判別目前登入者是否有權限執行此動作(驗證後要執行的動作,也就是加入購物車的動作),這裡可先填入true,以免無法使用使用購物車。public function authorize() { return true; } -
再將原先規則搬入
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'], ]; } - 若需要自訂訊息,只要新增一個messages函數,並將自訂訊息移入即可。
public function messages() { return [ 'required' => '請選擇商品', 'min' => '「:attribute」至少要 :min 個', ]; } -
若是想替欄位命名則可利用attribute來進行設定
public function attributes() { return [ 'amount' => '商品數量', ]; } -
修改
/專案/app/Http/Controllers/CartController.php控制器,修改store,$request的類別改用CartRequest,並將原本在裡面的驗證拿掉。public function store(CartRequest $request) { Cart::create($request->all()); return redirect()->route('cart.index'); } -
在上方加入使用我們自製的
CartRequestuse App\Http\Requests\CartRequest; - 修改
\專案\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 代碼並彈框告知用戶。 - 日後若有
update時,也是比照辦理即可,無須在控制器裡面寫驗證。public function update(CartRequest $request, $id) { // }
15-5 用 fillable 批量賦值寫入 
