🔒

Laravel 8.42 で加わった Password::defaults() を試してみた

2021/05/19に公開

前置き

以前、下記の記事を書きましたが、Ver.8.42 で更に、デフォルトのパスワードルールを設定できる機能が加わったので、試してみました。

Laravel 新しい Password ルールオブジェクトを試してみる。そして軽くショックを受ける。

そもそもパスワードの検証は、会員登録時やマイページでのパスワード変更時、場合によっては管理者が会員のパスワードを変更する時など複数の場所であり得ます。
その複数の場所でその都度同じルールを書くのではなく、1箇所でデフォルトを設定して、後はそれを呼び出そう、という感じの機能になります。

準備(デフォルト設定)

AppServiceProvider の boot() メソッドなどにて、例えば下記のように書きます。

use Illuminate\Validation\Rules\Password;

class AppServiceProvider extends ServiceProvider
{

    public function boot()
    {
        Password::defaults(function () {
            return Password::min(8)->mixedCase();
        });
    }
}

ちなみに、

use Illuminate\Support\Facades\Password
// ではなく、
use Illuminate\Validation\Rules\Password;
// です。

また、設定時は、::defaults() が正解です。(間違って、::default() と書かないよう注意しましょう)

使ってみる(呼び出し)

上記で設定したデフォルトのルールを呼び出すのは、例えば以下のようにします。

    $validated = $request->validate([
        'password' => ['required', Password::defaults()],
    ]);

呼び出す際も、::defaults() でOKです。(こちらは ::default() でも動作しますが、ややこしいので、::defaults()に統一しちゃいましょう。ドキュメントもそうなってます)

まだ続きが

これ以降の話は、執筆時点のドキュメントには記載されていませんが、以下のような事も可能になっています。

    $validated = $request->validate([
        // 下記は、['required', Password::defaults()] と同じ
        'password' => [...Password::required()],

        // 上記 + 'confirmed'
        'password' => [...Password::required(), 'confirmed'],
    ]);

PHP7.4からの新機能の「配列内での値のアンパック」の ... が使われています。
また、::required() の他に、::sometimes() もあったりします。

参考1:配列内での値のアンパック
参考2:本家ドキュメント Defining Default Password Rules
参考3:GitHub [8.x] Add ability to define default Password Rule

ただ、他の方もコードを見る場合は、普通に ['required', Password::default()] とした方が、分かり易そうですね。

もし、不備等ありましたらコメント下さい。

Discussion