Laravel表單請求驗證忽略某些欄位驗證。新增和修改時,對於資料的驗證有時候是不同的,如新增時要對郵箱進行唯一性驗證,那麼編輯時就要忽略該郵箱的唯一驗證,不然將始終提示郵箱已存在。對此,官方文件僅僅只是提供了粗糙的案例,用起來並不容易。本篇文章將提供2種方法(實際上就是一種方法的延伸)。
新增和修改時,對於資料的驗證有時候是不同的,如新增時要對郵箱進行唯一性驗證,那麼編輯時就要忽略該郵箱的唯一驗證,不然將始終提示郵箱已存在。對此,官方文件僅僅只是提供了粗糙的案例,用起來並不容易。本篇文章將提供2種方法(實際上就是一種方法的延伸)。
問題
問題具體描述,如有2個頁面,add.blade.php與edit.blade.php。
對於上述情況,有兩種解決,
1)寫2個表單請求驗證,如UsAddRequest.php
與UsUpdateRequest.php
分開獨立驗證。缺點是多寫檔案,程式碼重複,優點是清晰;
2)手動實現一個場景驗證。缺點就是程式碼多,優點是檔案少。
本文將記錄2)種方法實現。實際上,兩種方法是一致的,只是將1)種方法的邏輯融合到2)種,然後分離出場景驗證。
Laravel過濾表單驗證及手動場景驗證
以User模組為假設,路由、控制器、模板頁面請自行建立。對於新增就不多說了,重點在於編輯介面。
第一步:定義路由
Route::put(‘/update/{id}’,‘UserController@update’);
第二步:控制器方法、請求驗證、介面自行建立
第三步:過濾表單請求驗證
說明:新增與更新都使用UserReqest.php
驗證。
3.1、UserController控制器方法
// 新增
public function store(UserRequest $request){}
// 更新
public function update(UserRequest $request){}
3.2、UserRequest.php驗證實現
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UserRequest extends FormRequest
{
// 將驗證規則分離為屬性
protected $msg = [
'username.required' => '使用者名稱必須填寫',
'email.unique' => '郵箱已存在'
];
public function authorize()
{
return true;
}
// 驗證規則
public function rules()
{
return $this->scene();
}
// 錯誤資訊
public function messages()
{
return $this->msg;
}
// 驗證場景
protected function scene()
{
// 接收當前路由引數
$id = $this->route('id');
// 請求方法
$requestMethod = $this->method();
// 判斷是新增還是更新
if ($requestMethod == 'POST') {
// 新增操作
return [
'username' => 'required',
'email' => 'required|email|unique:users'
];
} else if ($requestMethod == 'PUT') {
// 刪除不需要的錯誤資訊
unset($this->msg['password.required']);
unset($this->msg['password.min']);
// 更新操作
return [
'email' => 'required|email|unique:users,email,' . $id
];
}
}
}
解釋:
自定義了一個scene
驗證場景;
scene
方法體中,根據請求方法的不同來區分是新增還是更新操作;
請求型別為POST
,則為新增操作,那麼驗證所有,請求型別為PUT
則為更新操作,那麼只驗證email
並過濾自身(不驗證)。
當更新時需要注意:
$id = $this->route('id');
獲取的是當前路由引數Route::put('/update/{id}','UserController@update');
,
驗證規則:'email' => 'required|email|unique:users,email,' . $id
忽略自身的驗證,需要注意:可以看到有2個email
,第一個email是驗證郵箱格式,第二個email是過濾當前驗證,'email,'.$id
必須嚴格按照這種格式。
這樣一個簡單的自定義場景驗證規則就完成了。
本作品採用《CC 協議》,轉載必須註明作者和本文連結