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レスポンスを返します)。



コメント