【Laravel】バリデーションをスッキリ綺麗に!フォームリクエスト(Form Request)の使い方まとめ

Laravel

Laravelのフォームリクエスト(Form Request)は、バリデーションや認可(Authorization)のロジックをコントローラから切り離し、専用のリクエストクラスに集約するための仕組みです。これを利用することで、コントローラをすっきりとクリーンに保つことができます。


1. フォームリクエストクラスの生成

まずはArtisanコマンドを使用して、専用のリクエストクラスを作成します。

Bash
php artisan make:request StoreBlogPostRequest

コマンドを実行すると、app/Http/Requests/StoreBlogPostRequest.php が自動生成されます。


2. リクエストクラスの実装

生成されたファイルを開き、authorize メソッドと rules メソッドを編集します。

PHP
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreBlogPostRequest extends FormRequest
{
    /**
     * ユーザーがこのリクエストを行う権限があるかどうかを判定
     */
    public function authorize(): bool
    {
        // 認証不要または別途認可制御を行う場合は true に変更します
        return true;
    }

    /**
     * リクエストに適用するバリデーションルールを定義
     */
    public function rules(): array
    {
        return [
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
        ];
    }
}

3. コントローラでの利用方法

作成したフォームリクエストクラスを、コントローラのメソッドの引数にタイプヒントとして指定します。これにより、メソッドが実行される前に自動的にバリデーションが走ります。

PHP
<?php

namespace App\Http\Controllers;

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

class PostController extends Controller
{
    public function store(StoreBlogPostRequest $request)
    {
        // このメソッドが実行された時点で、バリデーションは既に通過しています
        
        // バリデーション済みデータの取得
        $validated = $request->validated();
        
        // データの保存
        Post::create($validated);
        
        return redirect()->route('posts.index');
    }
}

4. フォームリクエストを使うメリット

  • コードの分離(関心の分離): コントローラがバリデーションの詳細を知る必要がなくなり、ビジネスロジックの記述に集中できます。
  • 高い再利用性: 同じバリデーションルールを、更新処理(Update)など他のコントローラやメソッドでも手軽に使い回せます。
  • エラーハンドリングの自動化: バリデーションに失敗した場合、自動的に直前のページへリダイレクトし、エラーメッセージをセッションにフラッシュします(APIリクエストの場合は、自動的に422のJSONレスポンスを返します)。

コメント