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を活用してみてください。