タイガーラック クリエイティブブログ
2024
April
03

【Laravel】パスワードリセット メールアドレス入力欄のバリデーションに独自ルールを追加する

先日、業務の中でLaravelのパスワードリセット機能をカスタマイズすることがありました。

元々、この入力欄には「必須」「形式が合っているか」などの最低限のバリデーションがLaravelデフォルトの機能として備わっています。

今回は少々複雑な条件でバリデーションを実装する必要があったので、どのファイルを編集すれば良いかなど、備忘録としてまとめます。

バリデーションルールを定義しているファイルを確認

まず、パスワードリセットのコントローラーファイルはこちらのファイルです。
app/Http/Controllers/Auth/ForgotPasswordController.php

use Illuminate\Foundation\Auth\SendsPasswordResetEmails;

SendsPasswordResetEmailsトレイトが利用されているので、今度は以下のファイルを見てみます。
vendor/laravel/ui/auth-backend/SendsPasswordResetEmails.php

/**
 * Validate the email for the given request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return void
 */
protected function validateEmail(Request $request)
{
    $request->validate(['email' => 'required|email']);
}

こちらが元のトレイトファイルとなっており、メールアドレスのバリデーションはvalidateEmailメソッドで定義されています。

見ての通り、必須・形式チェックの2つのルールが設定されています。
今回はここに独自のルールを追加する方法を紹介します。

トレイトファイルを複製してカスタマイズ

先ほど確認したSendsPasswordResetEmails.phpのvalidateEmailメソッドは、protected修飾子によりForgotPasswordController.phpではオーバーライドできません。

また、vendor配下のSendsPasswordResetEmails.phpを直接編集するわけにもいかないので、一度SendsPasswordResetEmails.phpを丸々コピーして、任意のディレクトリにコピーします。
今回はapp/Auth内へコピーしました。

そしてコピーしたapp/Auth/SendsPasswordResetEmails.phpを編集します。

/**
 * Validate the email for the given request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return void
*/
protected function validateEmail(Request $request)
{
    // $request->validate(['email' => 'required|email']); // 元のバリデーションルールをコメントアウト
    $request->validate([
        'email' => ['required', 'email', 'email:dns',
            new ResetPasswordRule(),
        ],
    ]);
}

今回は複雑なルールを設定する必要があったため、別途作成したResetPasswordRuleを設定していますが、要件に合わせて自由にカスタムすることが可能です。

トレイトの参照先を変更する

最後にForgotPasswordController.phpへ戻って、SendsPasswordResetEmailsトレイトの参照先を変更します。

use App\Auth\SendsPasswordResetEmails; // カスタムしたトレイト
// use Illuminate\Foundation\Auth\SendsPasswordResetEmails; // 元の参照先をコメントアウト

これで複製・カスタマイズして新しく用意したSendsPasswordResetEmailsトレイトを読み込むようになり、バリデーションルールを変更することができました。

このカテゴリの最新記事

関連記事

SHOP LIST

タイガーラック株式会社

〒577-0056
大阪府東大阪市長堂1-3-14 TOKUYASU Bld.