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'],
];
}
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');
}
在上方加入使用我們自製的 CartRequest
use 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)
{
//
}