表單驗證
參考資料 Laravel 文件 - 表單驗證
首先呢分析一下,表單來自 form 的提交,所以在我們的這個系統中,只有新增與修改,也就是 GET 與 PUT 方法需要對錶單進行驗證。
需要驗證的有必填、輸入字元、長度、上下限和存在這些需求。
這裡說明一下表單驗證 Request 類,這個類封裝了 request 請求,在請求進來時會通過自帶的 Validate 方法對 request 包含的欄位做驗證,成功就會被傳入控制器執行控制器的方法,不成功會返回錯誤碼(好像是402)和錯誤的 Session 並重定向面頁,這時之前的面頁包含的錯誤模板就會生效並輸出錯誤。
建立表單
這裡就展示購買記錄的驗證作為例子,其他根據需要做類似設定。
php artisan make:request PurchaseRequest
這裡建立了一個 Request 檔案,我們編輯一下
<?php
namespace App\Http\Requests;
use App\Models\Purchase;
use Illuminate\Foundation\Http\FormRequest;
class PurchaseRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
switch ($this->method()) {
case 'PUT':
return [
Purchase::EID => 'integer|exists:employees,id',
Purchase::CID => 'integer|exists:customers,id',
Purchase::PID => 'integer|exists:products,id',
Purchase::TOTAL_PRICE => 'numeric|min:0|max:1000000',
Purchase::PTIME => 'date|nullable',
Purchase::QTY => 'integer|min:0|max:2147483647|nullable'
];
case 'POST':
return [
Purchase::EID => 'required|integer|exists:employees,id',
Purchase::CID => 'required|integer|exists:customers,id',
Purchase::PID => 'required|integer|exists:products,id',
Purchase::TOTAL_PRICE => 'required|numeric|min:0|max:1000000',
Purchase::PTIME => 'required|date|nullable',
Purchase::QTY => 'required|integer|min:0|max:2147483647|nullable'
];
default:
return [];
}
}
public function messages()
{
return [
'required' => ':attribute 需要填寫',
'numeric' => ':attribute 必須是數字',
'max' => ':attribute 大於上限 :max',
'exists' => ':attribute 不存在',
'integer' => ':attribute 只能是整數',
'min' => ':attribute 小於下限 :min'
];
}
public function attributes()
{
return [
Purchase::EID => '員工',
Purchase::CID => '顧客',
Purchase::PID => '產品',
Purchase::TOTAL_PRICE => '總價格',
Purchase::PTIME => '購買時間',
Purchase::QTY => '購買數量'
];
}
}
解釋說明
首先下面這段程式碼是做一個許可權控制的,我們的邏輯比較簡單不做判斷,所以將原來的 false 改成 true
public function authorize()
{
return true;
}
接下來我們寫 rule 方法,這裡就是判斷的設定了
public function rules()
{
switch ($this->method()) {
case 'PUT':
return [
Purchase::EID => 'integer|exists:employees,id',
Purchase::CID => 'integer|exists:customers,id',
Purchase::PID => 'integer|exists:products,id',
Purchase::TOTAL_PRICE => 'numeric|min:0|max:1000000',
Purchase::PTIME => 'date|nullable',
Purchase::QTY => 'integer|min:0|max:2147483647|nullable'
];
case 'POST':
return [
Purchase::EID => 'required|integer|exists:employees,id',
Purchase::CID => 'required|integer|exists:customers,id',
Purchase::PID => 'required|integer|exists:products,id',
Purchase::TOTAL_PRICE => 'required|numeric|min:0|max:1000000',
Purchase::PTIME => 'required|date|nullable',
Purchase::QTY => 'required|integer|min:0|max:2147483647|nullable'
];
default:
return [];
}
}
可以看到 this->method()
將判斷請求的方法,POST 是新增,PUT 是修改, 我們在 POST 的 Purchase::EID 中寫了 required|integer|exists:employees,id
這裡可以繼續看一下文件下面的方法,required
表示欄位必須存在,這個在PUT 裡面就沒有,因為 PUT 可以區域性修改。integer
表示整數,exists:employess,id
由於我們知道這是一個外來鍵,所以必須存在於資料表employee
的 id
當中,不然就返回錯誤。
public function messages()
{
return [
'required' => ':attribute 需要填寫',
'numeric' => ':attribute 必須是數字',
'max' => ':attribute 大於上限 :max',
'exists' => ':attribute 不存在',
'integer' => ':attribute 只能是整數',
'min' => ':attribute 小於下限 :min'
];
}
上面這一段寫的是規則的別名,這裡可以自定義我們需要的提示資訊,:attribute
是佔位符,這裡會替換成對於的屬性名。
public function attributes()
{
return [
Purchase::EID => '員工',
Purchase::CID => '顧客',
Purchase::PID => '產品',
Purchase::TOTAL_PRICE => '總價格',
Purchase::PTIME => '購買時間',
Purchase::QTY => '購買數量'
];
}
上面則是屬性的自定義名稱。
接著我們完成其他的表單驗證就可以了,下面我們介紹在控制器裡使用這些表單