方便和強大的Laravel資料驗證

方便和強大的Laravel資料驗證

現在比以往任何時候都更重要的是,你的應用程式中的資料是有效的、準確的,並符合所有的系統要求。它解決了保持資料一致性和避免安全漏洞的需要。

Laravel讓資料驗證變得簡單而直觀。它遵循一個模型檢視控制器(MVC)架構,只需要PHP和麵向物件程式設計(OOP)概念的一般知識。此外, Laravel提供了幾種方法來驗證傳入的資料。

探索這些方法中的一些,以及如何將驗證規則應用於你的資料集。

  1. 在Laravel中輕鬆實現資料驗證
  2. 驗證的基礎知識
  3. 高階驗證
  4. 自定義驗證

在Laravel中輕鬆實現資料驗證

Laravel提供了幾個現成的驗證規則,當你的應用程式的使用者通過表單提交資料。你可以將輸入欄位標記為必填,設定一個最小或最大的長度,並要求唯一(非重複)的條目和有效的電子郵件地址。Laravel驗證器會檢查輸入是否滿足這些規則或你指定的任何其他規則。

這些Laravel的驗證規則包括:

  •  required — 欄位資料不能為空或空。
  •  array  — 欄位資料必須是一個PHP陣列。
  •  bail — 驗證規則在遇到第一次驗證失敗後停止執行。
  •  email — 欄位資料必須是一個有效的電子郵件地址。
  •  unique — 欄位資料在資料庫表中不能有重複的資料。

所有的驗證方法都有優點和缺點, 但它們的多樣性使你能夠選擇最好的方法來滿足你的需求. 根據你所選擇的方法,Laravel的驗證可以有幾種方式,手動或自動錯誤資訊。

最常見的方法是code>validate, 用於傳入的HTTP請求. 這個方法是與請求資料連鎖的, 執行驗證規則. 你可以用逗號把每個欄位的規則分開,如下面的例子所示。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
use Illuminate\Http\Request;
public function store (Request $request){
$validated = $request->validate([
'email' => ['required, unique:users, email, bail'],
'name' => ['required'],
]);
}
use Illuminate\Http\Request; public function store (Request $request){ $validated = $request->validate([ 'email' => ['required, unique:users, email, bail'], 'name' => ['required'], ]); }
use Illuminate\Http\Request;
public function store (Request $request){
$validated = $request->validate([
'email' => ['required, unique:users, email, bail'],
'name' => ['required'],
]);
}

這裡,email是一個必需的輸入,意味著它不能是空的。此外,它在 users 資料庫表中必須是唯一的,確保同一個電子郵件地址不會被註冊兩次。最後一條規則規定,電子郵件地址也必須是有效的。否則,驗證過程將停止。名字欄位是必須的,但沒有其他規則。

如果任何Laravel驗證規則失敗, 將自動生成一個響應.

驗證的基礎知識

為了更好地理解驗證方法,請考慮下面的例子。你將為該端點定義一個路由,並建立一個控制器來驗證和處理請求資料。

首先,建立一個簡單的端點,允許使用者儲存他們的電子郵件和密碼

定義路由

Laravel路由是在web應用的routes/web.php檔案中定義的,或者在API的routes/api.php中定義。在這個例子中, 使用api.php

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
use App\Http\Controllers\UserController;
Route::post('/store', [UserController::class]);
use App\Http\Controllers\UserController; Route::post('/store', [UserController::class]);
use App\Http\Controllers\UserController;
Route::post('/store', [UserController::class]);

建立控制器

執行這個Artisan命令來建立控制器:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
php artisan make:controller
UserController
php artisan make:controller UserController
php artisan make:controller
UserController

這個命令在app/Http/Controllers目錄下建立一個UserController.php檔案。

現在,定義一個 store 方法,在儲存前驗證進入儲存端點的資料。

這個例子將使用這些規則來驗證以下欄位:

  • email — 應該是唯一的,有效的電子郵件,而且必須是必填的
  • password — 應該有一個最小的長度,密碼確認,並且必須是必填的
  • age — 必須是一個數字,必須是必填的
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* Store new user details.
*
*/
public function store(Request $request){
$validated = $request->validate([
'email' => 'required|unique:users|email',
'age' => 'required|numeric',
'password' => 'required|min:7|confirmed'
]);
// After user data is validated, logic to store the data
}
}
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UserController extends Controller { /** * Store new user details. * */ public function store(Request $request){ $validated = $request->validate([ 'email' => 'required|unique:users|email', 'age' => 'required|numeric', 'password' => 'required|min:7|confirmed' ]); // After user data is validated, logic to store the data } }
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* Store new user details.
*
*/
public function store(Request $request){
$validated = $request->validate([
'email' => 'required|unique:users|email',
'age' => 'required|numeric',
'password' => 'required|min:7|confirmed'
]);
// After user data is validated, logic to store the data
}
}

confirmed 允許你要求一個特定的欄位兩次,以驗證資料是否準確,例如使用者在註冊時重新輸入密碼。這個規則要求一個叫做 password_confirmation 的欄位,其資料必須與password欄位相匹配。

顯示錯誤資訊

如果驗證標準得到滿足,你的程式碼將繼續正常執行。如果驗證失敗,會丟擲一個 IlluminateValidationValidationException 異常,並返回適當的錯誤響應。

這個例子是基於一個API,它以JSON格式返回 422 Unprocessable Entity HTTP響應。對於Web應用程式,它將重定向到之前的URL以顯示錯誤資訊,並將請求資料閃現到會話中。

你可以在你的檢視中使用 $errors 變數來顯示返回的錯誤:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
@if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif

你也可以選擇只檢視第一個錯誤或迴圈檢視所有錯誤。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// Fetch all errors
$errors->all()
// Fetch only the first error
$errors->first()
// Fetch all errors $errors->all() // Fetch only the first error $errors->first()
// Fetch all errors
$errors->all()
// Fetch only the first error
$errors->first()

重新填充表格

重新填充表單可以使使用者免於重新輸入資訊,這樣他們就可以專注於修復錯誤了。在電子郵件地址失敗的例子中,你可以通過呼叫 name 欄位的舊值來重新填充表單的其他部分。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$name = $request-> old('name')
//Blade helper
<input type="text" name="name" value="{{ old('name') }}">
$name = $request-> old('name') //Blade helper <input type="text" name="name" value="{{ old('name') }}">
$name = $request-> old('name')
//Blade helper
<input type="text" name="name" value="{{ old('name') }}">

如果之前沒有輸入,這個規則將返回 null

高階驗證

Laravel提供了另一種寫驗證的方法,叫做表單請求。表單請求是一個自定義的請求類,它可以組織驗證並分解你的控制器。

他們有自己的驗證和授權邏輯,適合大的輸入量,可以用來定義驗證規則和自定義錯誤資訊。

要建立一個表單請求,執行這個Artisan命令:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
php artisan make:request StoreUserRequest
php artisan make:request StoreUserRequest
php artisan make:request StoreUserRequest

這個命令在app/Http/Requests目錄下建立一個StoreUserRequest.php檔案,包含兩個預設方法:

  • rules 返回請求資料的驗證規則。
  • authorize 返回一個布林值,表示該使用者是否有許可權執行請求的操作。

轉換前面的例子,使用一個表單請求。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreUserRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
// Add logic to check if the user is authorized to submit this data.
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, mixed>
*/
public function rules()
{
return [
'email' => 'required|unique:users|email',
'age' => 'required|numeric',
'password' => 'required|min:7|confirmed'
];
}
}
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class StoreUserRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { // Add logic to check if the user is authorized to submit this data. return true; } /** * Get the validation rules that apply to the request. * * @return array<string, mixed> */ public function rules() { return [ 'email' => 'required|unique:users|email', 'age' => 'required|numeric', 'password' => 'required|min:7|confirmed' ]; } }
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreUserRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
// Add logic to check if the user is authorized to submit this data.
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, mixed>
*/
public function rules()
{
return [
'email' => 'required|unique:users|email',
'age' => 'required|numeric',
'password' => 'required|min:7|confirmed'
];
}
}

為了定製這些規則的錯誤資訊,你可以重寫 FormRequest 類中的messages方法。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
/**
* Get the error messages for the defined validation rules.
*
* @return array
*/
public function messages()
{
return [
'email.required' => 'An email address is required',
'email.email' => 'The email address must be valid',
'password.confirmed'=>'Re-type your password as
password_confirmation, passwords does not match'
];
}
/** * Get the error messages for the defined validation rules. * * @return array */ public function messages() { return [ 'email.required' => 'An email address is required', 'email.email' => 'The email address must be valid', 'password.confirmed'=>'Re-type your password as password_confirmation, passwords does not match' ]; }
/**
* Get the error messages for the defined validation rules.
*
* @return array
*/
public function messages()
{
return [
'email.required' => 'An email address is required',
'email.email' => 'The email address must be valid',
'password.confirmed'=>'Re-type your password as 
password_confirmation, passwords does not match'
];
}

注意:資料名稱和驗證規則在資訊資料前用句號(.)分開。

自定義驗證

要建立自定義的驗證,你可以使用 Validator facade來代替 validate 。驗證器例項包含兩個引數:要驗證的資料和一個驗證規則陣列。這兩個引數被傳遞給驗證器介面的 ::make 方法,生成一個新的驗證器例項。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
use Illuminate\Http\Request;
public function store (Request $request){
$validator = Validator::make($request->all(),[
'email' => 'required|unique:users|email',
'age' => 'required|numeric',
'password' => 'required|min:7|confirmed'
]);
if ($validator->fails()) {
// Return errors or redirect back with errors
return $validator->errors();
}
// Retrieve the validated input...
$validated = $validator->validated();
// Continue logic to store the data
}
use Illuminate\Http\Request; public function store (Request $request){ $validator = Validator::make($request->all(),[ 'email' => 'required|unique:users|email', 'age' => 'required|numeric', 'password' => 'required|min:7|confirmed' ]); if ($validator->fails()) { // Return errors or redirect back with errors return $validator->errors(); } // Retrieve the validated input... $validated = $validator->validated(); // Continue logic to store the data }
use Illuminate\Http\Request; 
public function store (Request $request){
$validator = Validator::make($request->all(),[
'email' => 'required|unique:users|email',
'age' => 'required|numeric',
'password' => 'required|min:7|confirmed'
]);
if ($validator->fails()) {
// Return errors or redirect back with errors
return $validator->errors();
}
// Retrieve the validated input...
$validated = $validator->validated();
// Continue logic to store the data
}

如果你想新增一個自動的直接,你可以在一個預先存在的驗證器例項上執行 validate 方法。如果驗證失敗,XHR請求會產生一個JSON響應,狀態碼是 422 Unprocessable Entity ,或者使用者會立即被重定向。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$validator = Validator::make($request->all(),[
'email' => 'required|unique:users|email',
'password' => 'required|min:7|confirmed'
])->validate();
$validator = Validator::make($request->all(),[ 'email' => 'required|unique:users|email', 'password' => 'required|min:7|confirmed' ])->validate();
$validator = Validator::make($request->all(),[
'email' => 'required|unique:users|email',
'password' => 'required|min:7|confirmed'
])->validate();

你也可以通過向 Validate::make method 傳遞名為 messages 的第三個引數來定製你的錯誤資訊:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$validator = Validator::make($request->all(),[
'email' => 'required|unique:users|email',
'age' => 'required|numeric',
'password' => 'required|min:7|confirmed'
], $messages = [
'required' => 'The :attribute field is required.',
]);
$validator = Validator::make($request->all(),[ 'email' => 'required|unique:users|email', 'age' => 'required|numeric', 'password' => 'required|min:7|confirmed' ], $messages = [ 'required' => 'The :attribute field is required.', ]);
$validator = Validator::make($request->all(),[
'email' => 'required|unique:users|email',
'age' => 'required|numeric',
'password' => 'required|min:7|confirmed'
], $messages = [
'required' => 'The :attribute field is required.',
]);

注意::attribute 被替換為被驗證欄位的名稱。

小結

執行資料驗證對於保持你的資料集的清潔、正確和完整至關重要。資料驗證允許你消除資料中的錯誤,這些錯誤有可能破壞或影響你的專案。在大規模工作和處理大量資料時, 驗證變得越來越重要.

Laravel提供了許多靈活的方法來確保通過你的應用程式的資料的完整性和準確性。你可以用預設的和可定製的方法來實現複雜的驗證邏輯, 使你的程式碼庫結構良好,更容易重用。

評論留言