【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トレイトを読み込むようになり、バリデーションルールを変更することができました。
このカテゴリの最新記事
2024.03.22
2023.04.21
2024.05.15
2024.06.14