バリデーション
はじめに
Laravel は、アプリケーションの受信データを検証するためのさまざまなアプローチを提供しています。ほとんどの場合、すべての受信 HTTP リクエストで利用可能な validate
メソッドを使用することが一般的です。ただし、他の検証アプローチについても説明します。
Laravel には、データに適用できる便利な検証ルールが多数含まれており、特定のデータベーステーブルで値が一意であるかどうかを検証する機能も提供しています。これらの検証ルールについて詳しく説明し、Laravel のすべての検証機能に精通していただけるようにします。
検証クイックスタート
Laravel の強力な検証機能について学ぶために、フォームの検証とエラーメッセージのユーザーへの表示の完全な例を見てみましょう。この高レベルの概要を読むことで、Laravel を使用して受信リクエストデータを検証する方法について一般的な理解を得ることができます。
ルートの定義
まず、routes/web.php
ファイルに次のルートが定義されていると仮定しましょう:
use App\Http\Controllers\PostController;
Route::get('/post/create', [PostController::class, 'create']);
Route::post('/post', [PostController::class, 'store']);
GET
ルートは、ユーザーが新しいブログ投稿を作成するためのフォームを表示し、POST
ルートは新しいブログ投稿をデータベースに保存します。
コントローラの作成
次に、これらのルートへの受信リクエストを処理するシンプルなコントローラを見てみましょう。現時点では store
メソッドは空のままにしておきます:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
class PostController extends Controller
{
/**
* Show the form to create a new blog post.
*/
public function create(): View
{
return view('post.create');
}
/**
* Store a new blog post.
*/
public function store(Request $request): RedirectResponse
{
// Validate and store the blog post...
$post = /** ... */
return to_route('post.show', ['post' => $post->id]);
}
}
検証ロジックの記述
新しいブログ投稿を検証するためのロジックを store
メソッドに記入する準備が整いました。これには、Illuminate\Http\Request
オブジェクトが提供する validate
メソッドを使用します。検証ルールが成功すると、コードは通常通り実行されます。ただし、検証に失敗すると、Illuminate\Validation\ValidationException
例外がスローされ、適切なエラーレスポンスが自動的にユーザーに送信されます。
HTTPリクエスト中に検証が失敗した場合、前のURLにリダイレクトする応答が生成されます。着信リクエストがXHRリクエストである場合、検証エラーメッセージを含むJSON応答が返されます。
validate
メソッドをよりよく理解する ために、store
メソッドに戻りましょう:
/**
* Store a new blog post.
*/
public function store(Request $request): RedirectResponse
{
$validated = $request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
// The blog post is valid...
return redirect('/posts');
}
検証ルールがvalidate
メソッドに渡されていることがわかります。心配しないでください - 利用可能なすべての検 証ルールは文書化されています。再度、検証が失敗した場合、適切な応答が自動的に生成されます。検証に合格した場合、当該コントローラは通常通りに実行を続けます。
代わりに、検証ルールは、単一の|
区切り文字列ではなく、ルールの配列として指定することもできます:
$validatedData = $request->validate([
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
]);
さらに、リクエストを検証し、名前付きエラーバッグにエラーメッセージを格納するためにvalidateWithBag
メソッドを使用することもできます:
$validatedData = $request->validateWithBag('post', [
'title' => ['required', 'unique:posts', 'max:255'],
'body' => ['required'],
]);
最初の検証エラーで停止
時々、属性の最初の検証エラー後に検証ルールの実行を停止したい場合があります。そのためには、属性にbail
ルールを割り当てます:
$request->validate([
'title' => 'bail|required|unique:posts|max:255',
'body' => 'required',
]);
この例では、title
属性のunique
ルールが失敗した場合、max
ルールはチェックされません。ルールは割り当てられた順に検証されます。