メインコンテンツへスキップ

Documentation Index

Fetch the complete documentation index at: https://kawax.biz/llms.txt

Use this file to discover all available pages before exploring further.

バリデーションとは

バリデーションとは、ユーザーから送信されたデータが期待する形式や条件を満たしているかを検証することです。 Laravelはリクエストオブジェクトの validate メソッドや専用のフォームリクエストクラスを使った、シンプルで強力なバリデーション機能を提供しています。

コントローラーでのバリデーション

$request->validate() の使い方

コントローラーのメソッド内で $request->validate() を呼び出すのが、最もシンプルなバリデーション方法です。 バリデーションに失敗すると、Laravelはユーザーを前の画面に自動でリダイレクトし、エラー情報をセッションに保存します。 ルートを定義します。
use App\Http\Controllers\PostController;

Route::get('/post/create', [PostController::class, 'create']);
Route::post('/post', [PostController::class, 'store']);
コントローラーを作成します。
<?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;

class PostController extends Controller
{
    public function create(): View
    {
        return view('post.create');
    }

    public function store(Request $request): RedirectResponse
    {
        $validated = $request->validate([
            'title' => 'required|string|max:255',
            'body'  => 'required|string',
            'email' => 'required|email',
        ]);

        // バリデーション済みのデータで投稿を保存する...

        return redirect('/posts');
    }
}
validate メソッドにはフィールド名をキー、ルールを値とした配列を渡します。 ルールはパイプ | で区切るか、配列で指定できます。
// パイプ区切り
'title' => 'required|string|max:255',

// 配列形式
'title' => ['required', 'string', 'max:255'],

主要なバリデーションルール

ルール説明
required値が存在し、空でないこと
string文字列であること
email有効なメールアドレス形式であること
min:値文字列の長さ、または数値が指定値以上であること
max:値文字列の長さ、または数値が指定値以下であること
unique:テーブル指定したテーブルで値が一意であること
nullable値が null でも許可する
integer整数であること
boolean真偽値(true/false1/0 など)であること
date有効な日付形式であること
confirmedフィールド名_confirmation フィールドと一致すること
利用可能なすべてのバリデーションルールは公式ドキュメントで確認できます。

バリデーション済みデータの利用

validate メソッドの戻り値は、バリデーションに通ったデータのみを含む配列です。 信頼できるデータとして安全に使えます。
$validated = $request->validate([
    'title' => 'required|string|max:255',
    'body'  => 'required|string',
]);

// $validated は ['title' => '...', 'body' => '...'] の形式
Post::create($validated);

Bladeテンプレートでのエラー表示

バリデーションに失敗すると、Laravelは $errors 変数をすべてのビューで自動的に利用できるようにします。 web ミドルウェアグループに含まれる ShareErrorsFromSession ミドルウェアがこれを担っています。

すべてのエラーを一覧表示する

@if ($errors->any())
    <ul>
        @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
        @endforeach
    </ul>
@endif

フィールドごとにエラーを表示する

@error ディレクティブを使うと、特定のフィールドのエラーをインラインで表示できます。
<label for="title">タイトル</label>

<input
    id="title"
    type="text"
    name="title"
    value="{{ old('title') }}"
    class="@error('title') is-invalid @enderror"
/>

@error('title')
    <div class="error-message">{{ $message }}</div>
@enderror
old('フィールド名') を使うと、バリデーション失敗後もユーザーが入力した値をフォームに再表示できます。

フォームリクエスト

フォームリクエストとは

バリデーションロジックが複雑になってきた場合は、「フォームリクエスト」クラスに切り出すのが効果的です。 フォームリクエストはバリデーションと認可のロジックをひとつのクラスにまとめたカスタムリクエストクラスです。

フォームリクエストの作成

make:request Artisanコマンドでフォームリクエストクラスを生成します。
php artisan make:request StorePostRequest
app/Http/Requests/StorePostRequest.php が生成されます。
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StorePostRequest extends FormRequest
{
    /**
     * このリクエストを実行する権限があるか判定する
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * このリクエストに適用するバリデーションルールを返す
     *
     * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
     */
    public function rules(): array
    {
        return [
            'title' => 'required|string|max:255',
            'body'  => 'required|string',
            'email' => 'required|email|unique:posts',
        ];
    }
}

rules() メソッド

バリデーションルールを配列で返します。コントローラーの validate メソッドに渡す配列と同じ形式です。

authorize() メソッド

このリクエストを実行する権限があるかを判定します。 true を返すと認可OK、false を返すと403レスポンスが自動的に返されます。 認証済みユーザーのみ許可する場合、auth()->check() で確認できます。 チュートリアルでは true を返しておけば問題ありません。
authorize メソッドが false を返すと、コントローラーのメソッドは実行されず、403 Forbiddenレスポンスが返されます。

コントローラーへの注入

フォームリクエストはコントローラーメソッドのタイプヒントとして指定するだけで使えます。 コントローラーが呼び出される前にバリデーションが実行されるため、メソッド内にバリデーションコードを書く必要はありません。
use App\Http\Requests\StorePostRequest;

class PostController extends Controller
{
    public function store(StorePostRequest $request): RedirectResponse
    {
        // ここに到達した時点でバリデーション済み

        $validated = $request->validated();

        Post::create($validated);

        return redirect('/posts');
    }
}
$request->validated() でバリデーション済みのデータのみを取得できます。

実践例:投稿フォームの作成と保存

フォームの表示から送信・バリデーション・保存までの一連のフローです。
1

ルートの定義

use App\Http\Controllers\PostController;

Route::get('/posts/create', [PostController::class, 'create']);
Route::post('/posts', [PostController::class, 'store']);
2

フォームリクエストの作成

php artisan make:request StorePostRequest
public function rules(): array
{
    return [
        'title' => 'required|string|max:255',
        'body'  => 'required|string',
    ];
}

public function authorize(): bool
{
    return true;
}
3

コントローラーの実装

use App\Http\Requests\StorePostRequest;
use App\Models\Post;

class PostController extends Controller
{
    public function create(): View
    {
        return view('posts.create');
    }

    public function store(StorePostRequest $request): RedirectResponse
    {
        Post::create($request->validated());

        return redirect('/posts');
    }
}
4

Bladeテンプレートの作成

{{-- resources/views/posts/create.blade.php --}}

<h1>新しい投稿</h1>

@if ($errors->any())
    <ul>
        @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
        @endforeach
    </ul>
@endif

<form method="POST" action="/posts">
    @csrf

    <div>
        <label for="title">タイトル</label>
        <input
            id="title"
            type="text"
            name="title"
            value="{{ old('title') }}"
        />
        @error('title')
            <span>{{ $message }}</span>
        @enderror
    </div>

    <div>
        <label for="body">本文</label>
        <textarea id="body" name="body">{{ old('body') }}</textarea>
        @error('body')
            <span>{{ $message }}</span>
        @enderror
    </div>

    <button type="submit">投稿する</button>
</form>
Bladeフォームには必ず @csrf ディレクティブを含めてください。CSRFトークンがないとLaravelは419エラーを返します。

次のステップ

HTTPリクエスト

リクエストオブジェクトを使ったデータ取得方法を振り返ります。
Last modified on April 6, 2026