手帳

  • 2025-03-30
  • IT系

なんかとんでもないタイトルになったのは、Claudeに調べてもらったことをブログ記事っぽく書き直してと依頼したからです。恥ずかしい。。。というか全体的に大げさに書き直してくれるのどうにかしてくれないかな。

こんにちは、Laravel愛好家の皆さん!今回は、Laravel 11で実装されているバリデーション機能について深掘りしていきます。フォームからの入力データを検証することは、Webアプリケーション開発において非常に重要な要素です。Laravelは洗練されたバリデーション機能を提供しており、今回はその使い方をマスターしていきましょう。

(1)フォームリクエストで優雅にバリデーションを実装

Laravel フォームリクエストのバリデーションフロー クライアント (ブラウザ) ルーティング (routes/web.php) コントローラー (UserController) フォームリクエスト (StoreUserRequest) モデル (User) データベース (users テーブル) // コントローラー public function store(StoreUserRequest $request) { $validated = $request->validated(); User::create($validated); } 1. HTTP POST 2. ルート処理 3. DI コンテナによる解決 4. バリデーション後 コントローラーに渡す 5. バリデーション済み データでモデル作成 6. 保存 フォームリクエスト内部処理 1. authorize() 認可チェック 2. rules() バリデーションルール適用 3. validated() 検証済みデータ取得

Laravel 11では、フォームリクエストを使用することで、コントローラーをスリムに保ちながら堅牢なバリデーションを実現できます。まずは以下のコマンドでリクエストクラスを作成しましょう。

php artisan make:request StoreUserRequest

作成されたリクエストクラスは次のように実装できます。

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreUserRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

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

フォームリクエストの使い方@コントローラー

public function store(StoreUserRequest $request)
{
    // バリデーション済みのデータを取得
    $validated = $request->validated();
    
    // ユーザー作成処理
    User::create($validated);
    
    return redirect()->route('users.index')->with('success', 'ユーザーが正常に作成されました');
}

余談:authorize()メソッドの真の目的とは?

authorize()メソッドは、リクエストの認可を制御するための重要な部分です。単にreturn true;と記述するだけではなく、この機能を活用することで細かなアクセス制御が可能になります。

例えば、特定のユーザーだけがアクションを実行できるようにしたい場合:

public function authorize()
{
// 管理者権限を持つユーザーのみ許可
return auth()->check() && auth()->user()->isAdmin();
}

あるいは、特定のリソースに対する権限チェックを行いたい場合:

public function authorize()
{
$postId = $this->route('post');
$post = Post::find($postId);

// 現在のユーザーがこの投稿の所有者かどうかをチェック
return $post && $post->user_id === auth()->id();
}

ルートパラメータと$this->route()の関係

ここで使用されている$this->route('post')は、ルート定義で指定されたパラメータを取得するメソッドです。例えば、以下のようなルート定義があった場合:

Route::put('/posts/{post}', [PostController::class, 'update']);

{post}という名前で定義されたパラメータの値(多くの場合はID)を取得します。重要なのは、取得したいパラメータ名がルート定義のパラメータ名と一致している必要があるという点です。

(2)バリデータファサードによる柔軟な検証

コントローラー内で直接バリデーションを行いたい場合は、Validatorファサードを使用する方法もあります:

use Illuminate\Support\Facades\Validator;

public function store(Request $request)
{
    $validator = Validator::make($request->all(), [
        'name' => 'required|string|max:255',
        'email' => 'required|string|email|max:255|unique:users',
        'password' => 'required|string|min:8|confirmed',
    ]);

    if ($validator->fails()) {
        return redirect()->back()
                    ->withErrors($validator)
                    ->withInput();
    }
    
    // 検証済みデータの取得
    $validated = $validator->validated();
    
    // 以降の処理...
}

この方法は、動的にバリデーションルールを変更したい場合や、条件によってバリデーションロジックを変更したい場合に特に有用です。

(3)簡潔なバリデーションシンタックス

シンプルなシナリオにはバリデーショントレイトを利用したこの方法が良いかと。

ublic function store(Request $request)
{
    $validated = $request->validate(
        [
        'name' => 'required|string|max:255',
        'email' => 'required|string|email|max:255|unique:users',
        'password' => 'required|string|min:8|confirmed',
        ]
        ,[
        //ここにStoreUserRequest::messageと同じように独自エラーメッセージでoverrideできる
        ]
        );
    
    User::create($validated);
    
    return redirect()->route('users.index')->with('success', 'ユーザーが正常に作成されました');
}

おまけ:カスタムバリデーションルールでアプリケーション固有のロジックを実装

FormRequestクラスにmessagesメソッドを追加することで、エラーメッセージをカスタマイズできます:

public function messages()
{
    return [
        'email.required' => 'メールアドレスは必須項目です',
        'email.email' => '正しい形式のメールアドレスを入力してください',
        'password.min' => 'パスワードは:min文字以上で設定してください',
    ];
}

また、属性名をカスタマイズするには以下のようにします:

public function attributes()
{
    return [
        'email' => 'メールアドレス',
        'password' => 'パスワード',
    ];
}