【Laravel】リクエストクラスを使って入力値を整理・検証する方法|FormRequestの実用例

【Laravel】リクエストクラスを使って入力値を整理・検証する方法|FormRequestの実用例 Laravel

Laravelでフォーム送信を処理する際、バリデーションルールやエラーメッセージをコントローラに直接書いてしまうと、可読性や保守性が低下しがちです。そんなときに役立つのがFormRequest(フォームリクエスト)です。

FormRequestを使うことで、入力値のバリデーションや前処理、権限チェックなどをクラス単位で整理でき、コントローラをスリムに保つことができます。この記事では、FormRequestの基本から実用的な活用例まで解説します。

FormRequestとは?

FormRequestは、Laravelが提供するHTTPリクエストの拡張クラスです。通常のIlluminate\Http\Requestを継承しつつ、バリデーションルールや権限チェックなどを追加できる仕組みになっています。

FormRequestを使うことで、以下のような恩恵が得られます。

  • バリデーションルールの一元化
  • バリデーションエラー処理の共通化
  • コントローラの肥大化防止

FormRequestクラスの作成

以下のArtisanコマンドで、FormRequestクラスを作成できます。

php artisan make:request StoreUserRequest

生成されたファイルはapp/Http/Requests/StoreUserRequest.phpに配置されます。

ルールの定義

作成したリクエストクラスを開き、rules()メソッドにバリデーションルールを定義します。

public function rules(): array
{
    return [
        'name'  => 'required|string|max:50',
        'email' => 'required|email|unique:users,email',
        'password' => 'required|min:8|confirmed',
    ];
}

authorize() メソッドは通常 true を返せばOKです。

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

コントローラでの使用方法

コントローラのメソッドの引数に、作成したFormRequestクラスを型指定することで、自動的にバリデーションが実行されます。

use App\Http\Requests\StoreUserRequest;

public function store(StoreUserRequest $request)
{
    // バリデーション済みのデータを取得
    $validated = $request->validated();

    // 登録処理
    User::create($validated);

    return redirect('/')->with('message', '登録が完了しました');
}

$request->validated() を使うことで、検証済みのデータだけを安全に取得できます。

エラーメッセージのカスタマイズ

リクエストクラス内でmessages()メソッドを定義することで、エラーメッセージをカスタマイズできます。

public function messages(): array
{
    return [
        'name.required' => '名前は必須です。',
        'email.email'   => 'メールアドレスの形式が正しくありません。',
    ];
}

フォームリクエストで前処理を行う

FormRequest内で入力値の整形など、前処理をしたい場合はprepareForValidation()メソッドを使います。

protected function prepareForValidation()
{
    $this->merge([
        'email' => strtolower($this->email),
    ]);
}

このように、バリデーション前に入力値の加工を行うことができます。

複数のFormRequestを使い分ける

登録用、更新用など用途ごとにFormRequestを分けておくと、場面に応じたルール設計がしやすくなります。

php artisan make:request UpdateUserRequest

更新時はuniqueルールにexcept条件を付けるなど、別のルールにできるのが大きなメリットです。

まとめ

FormRequestを使えば、バリデーションや入力処理をモデルとは独立して整理でき、アプリケーション全体の可読性・保守性が大きく向上します。

Laravelではわずか1行の型指定で導入できるため、バリデーションを整理したいと感じたら、ぜひFormRequestを活用してみてください。