Laravel Rule 系でも when が使えるようになりました
前書き
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
雑感
いつかこの機能使ってみたいです。
おかしな箇所ありましたらコメント下さい。
Discussion