Laravel 自定義表單請求驗證忽略某些欄位驗證

helong3314發表於2021-04-25

Laravel表單請求驗證忽略某些欄位驗證。新增和修改時,對於資料的驗證有時候是不同的,如新增時要對郵箱進行唯一性驗證,那麼編輯時就要忽略該郵箱的唯一驗證,不然將始終提示郵箱已存在。對此,官方文件僅僅只是提供了粗糙的案例,用起來並不容易。本篇文章將提供2種方法(實際上就是一種方法的延伸)。

新增和修改時,對於資料的驗證有時候是不同的,如新增時要對郵箱進行唯一性驗證,那麼編輯時就要忽略該郵箱的唯一驗證,不然將始終提示郵箱已存在。對此,官方文件僅僅只是提供了粗糙的案例,用起來並不容易。本篇文章將提供2種方法(實際上就是一種方法的延伸)。

問題

問題具體描述,如有2個頁面,add.blade.php與edit.blade.php。

對於上述情況,有兩種解決,

1)寫2個表單請求驗證,如UsAddRequest.phpUsUpdateRequest.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 協議》,轉載必須註明作者和本文連結

相關文章