🚁

Laravel Rule 系でも when が使えるようになりました

2 min read

前書き

Laravel 8.45からRule系でもwhen()メソッドが使えるようになりましたので、試してみました。
このwhen()メソッドは、クエリビルダーなどでよく見かけますが、第1引数に指定した条件が true であれば、第2引数で指定したコールバック関数を実行する、という感じになります。

今回は、Passwordルールを使ってみますので、下記なども参考にして下さい。

Laravel 新しい Password ルールオブジェクトを試してみる。そして軽くショックを受ける。
Laravel 8.42 で加わった Password::defaults() を試してみた

早速試す

今回は、このような感じのパスワードのルールを想定しました。

(1) パスワードは、8文字以上は最低必要。
(2) 8~10文字の時は、大文字と小文字のアルファベットを含まないといけない。
(3) 11文字以上の時は、(2)は不要。

まずは、単に(1)だけの場合は、下記の感じになります。(以下、web.php の想定)

use Illuminate\Validation\Rules\Password;

Route::post('', function (Request $request) {
    $validated = $request->validate([
        'password' => ['required', Password::defaults()],
    ]);

    dd($validated);
});

デフォルト設定していなければ、Password::defaults() と書く事により、'string|min:8' が適用されます。
では、(2)(3)を満たす為に、以下のようにやります。

use Illuminate\Validation\Rules\Password;

Route::post('', function (Request $request) {
    $validated = $request->validate([
        'password' => ['required', Password::defaults()->when(
            strlen($request->password) < 11,
            fn($rule) => $rule->mixedCase()
        )],
    ]);

    dd($validated);
});

第1引数の条件を満たした時、第2引数のコールバックが実行されて(2)のルールも適用される事になります。(第2引数のコールバック関数は、アロー関数(PHP7.4~)を使って書いていますが、もちろん普通のタイプでも大丈夫です)

で、他には?

若干話は逸れますが、この when() とかその反対の unless() は、トレイト化されました。
ですので、自分が作ったクラスで、when() / unless() を使いたければ、
Illuminate\Support\Traits\Conditionable
のトレイトをインポートしてやればOKです。

参考:GitHub [8.x] Introduce Conditional trait on validation rules #37504
参考:GitHub [8.x] Use "Conditionable" in existing classes that implement when() #37561

雑感

いつかこの機能使ってみたいです。

おかしな箇所ありましたらコメント下さい。