Laravel でのデータ検証: 便利で強力
公開: 2023-05-03アプリケーション内のデータが有効かつ正確で、すべてのシステム要件を満たしていることが、これまで以上に重要になっています。 データの一貫性を維持し、セキュリティの脆弱性を回避する必要性に対処します。
Laravel は、データ検証を簡単かつ直感的にします。 モデル ビュー コントローラー (MVC) アーキテクチャに従い、PHP とオブジェクト指向プログラミング (OOP) の概念に関する一般的な知識のみが必要です。 さらに、Laravel は受信データを検証するためのいくつかの方法を提供します。
これらのアプローチのいくつかと、検証ルールをデータセットに適用する方法を調べてください。
Laravelでデータ検証が簡単に
Laravel は、アプリケーションのユーザーがフォーム経由でデータを送信するときに、すぐに使用できるバリデーション ルールをいくつか提供します。 入力フィールドを必須としてマークし、最小または最大の長さを設定し、一意の (重複しない) エントリと有効な電子メール アドレスを要求することができます。 Laravelバリデーターは、入力がこれらのルールまたは指定した他のルールを満たしているかどうかをチェックします。
これらの Laravel 検証ルールには以下が含まれます。
-
required
— フィールド データを null または空にすることはできません。 -
array
— フィールド データは PHP 配列でなければなりません。 -
bail
— 検証ルールは、最初の検証エラーが発生した後に実行を停止します。 -
email
— フィールド データは有効な電子メール アドレスである必要があります。 -
unique
— データベース テーブル内でフィールド データに重複があってはなりません。
すべての検証方法には長所と短所がありますが、その多様性により、ニーズに最適なアプローチを選択できます。 選択した方法に応じて、Laravel の検証はいくつかの方法で発生し、手動または自動のエラー メッセージが表示されます。
最も一般的な方法は code>validate で、着信 HTTP 要求に使用されます。 このメソッドは要求データにチェーンされ、検証ルールを実行します。 以下の例に示すように、各フィールドのルールをコンマで区切ることができます。
use Illuminate\Http\Request; public function store (Request $request){ $validated = $request->validate([ 'email' => ['required, unique:users, email, bail'], 'name' => ['required'], ]); }
ここで、 email
必須入力です。つまり、null にすることはできません。 さらに、同じ電子メール アドレスが 2 回登録されないように、 users
データベース テーブル内で一意である必要があります。 最後のルールは、電子メール アドレスも有効である必要があることを示しています。 それ以外の場合、検証プロセスは停止します。 名前フィールドは必須ですが、他のルールはありません。
いずれかの Laravel 検証ルールが失敗した場合、応答が自動的に生成されます。
検証の基本
検証方法をよりよく理解するために、次の例を検討してください。 エンドポイントのルートを定義し、要求データを検証して処理するためのコントローラーを作成します。
まず、ユーザーがメールとパスワードを保存できるようにする単純なエンドポイントを作成します。
ルートを定義する
Laravel ルートは、Web アプリケーション用のroutes/web.phpファイルまたは API 用のroutes/api.phpファイルで定義されます。 この例では、 api.phpを使用します。
use App\Http\Controllers\UserController; Route::post('/store', [UserController::class]);
コントローラーを作成する
次のアーティザン コマンドを実行して、コントローラーを作成します。
php artisan make:controller UserController
このコマンドは、 app/Http/ControllersディレクトリにUserController.phpファイルを作成します。
ここで、 store エンドポイントに入るデータを保存する前に検証するためのstore
メソッドを定義します。
この例では、これらのルールを使用して次のフィールドを検証します。
- email — 一意で、有効な電子メールである必要があり、必須である必要があります
- password — 最小の長さ、パスワードの確認が必要であり、必須である必要があります
- age — 数値である必要があり、必須である必要があります
<?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
ルールを使用すると、ユーザーが登録時にパスワードを再入力するなど、データが正確であることを確認するために、特定のフィールドを 2 回要求することができます。 このルールにはpassword_confirmation
というフィールドが必要で、そのデータはpasswordフィールドと一致する必要があります。
エラー メッセージの表示
検証基準が満たされている場合、コードは引き続き正常に実行されます。 検証が失敗した場合、 IlluminateValidationValidationException
例外がスローされ、適切なエラー応答が返されます。
この例は、 422 Unprocessable Entity
HTTP 応答を JSON 形式で返す API に基づいています。 Web アプリケーションの場合、以前の URL にリダイレクトしてエラー メッセージを表示し、要求データがセッションにフラッシュされました。
ビューで$errors
変数を使用して、返されたエラーを表示できます。
@if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif
最初のエラーのみを表示するか、ループスルーしてすべてを表示するかを選択することもできます。
// Fetch all errors $errors->all() // Fetch only the first error $errors->first()
フォームの再入力
フォームを再入力すると、ユーザーは情報を再入力する手間が省け、エラーの修正に集中できます。 電子メール アドレスが失敗する例では、 name
フィールドの古い値を呼び出すことで、フォームの残りの部分を再入力できます。
$name = $request-> old('name') //Blade helper <input type="text" name="name" value="{{ old('name') }}">
前の入力がない場合、このルールはnull
を返します。
高度な検証
Laravel は、フォームリクエストと呼ばれるバリデーションを記述する別の方法を提供します。 フォーム リクエストは、検証を整理し、コントローラを整理するカスタム リクエスト クラスです。
これらには、大量の入力に適した独自の検証および承認ロジックがあり、検証ルールの定義やエラー メッセージのカスタマイズに使用できます。
フォーム リクエストを作成するには、次の Artisan コマンドを実行します。
php artisan make:request StoreUserRequest
このコマンドはapp/Http/RequestsディレクトリにStoreUserRequest.phpファイルを作成し、2 つのデフォルト メソッドを含みます。
-
rules
要求データの検証規則を返します。 -
authorize
そのユーザーが要求されたアクションを実行する権限を持っているかどうかを示すブール値を返します。
前の例をフォーム リクエストを使用するように変換します。
<?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
クラスのメッセージ メソッドをオーバーライドします。
/** * 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' ]; }
注:データ名と検証ルールは、メッセージ データの前にピリオド (.) で区切られます。
カスタム検証
カスタム検証を作成するには、 validate
の代わりにValidator
ファサードを使用できます。 バリデータ インスタンスには、検証するデータと検証ルールの配列の 2 つの引数が含まれます。 これら 2 つの引数は、バリデータ ファサードの::make
メソッドに渡され、新しいバリデータ インスタンスが生成されます。
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 リクエストは422 Unprocessable Entity
をステータス コードとして含む JSON レスポンスを生成するか、ユーザーはすぐにリダイレクトされます。
$validator = Validator::make($request->all(),[ 'email' => 'required|unique:users|email', 'password' => 'required|min:7|confirmed' ])->validate();
messages
と呼ばれる 3 番目の引数をValidate::make method
に渡すことで、エラー メッセージをカスタマイズすることもできます。
$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 は、アプリケーションを通過するデータの整合性と正確性を確保するための多数の柔軟なアプローチを可能にします。 デフォルトおよびカスタマイズ可能なメソッドを使用して複雑な検証ロジックを実現し、コードベースを適切に構造化して、より簡単に再利用できるようにすることができます。
Kinsta のアプリケーション ホスティング サービスを使用して、Laravel アプリをより迅速に出荷します。