Laravelデフォルトのパスワードリセット機能を使って、パスワードに独自のバリデーションをかけたいです。バリデーションを制御できずに困っています。
バージョンは5.8です。
やったこと
Illuminate\Foundation\Auth\ResetsPasswords.phpを参考に
ResetPasswordControllerにrulesメソッドとvalidationErrorMessagesメソッドをオーバーライドしました。
PHP
1// ResetPasswordController 2 3protected function rules() 4{ 5 return [ 6 'token' => 'required', 7 'email' => 'required|email', 8 'password' => 'required|confirmed|min:6', //min:8→min:6 9 ]; 10} 11protected function validationErrorMessages() 12{ 13 return [ 14 'password.min' => '最低6文字', 15 'password.confirmed' => '一致しません', 16 ]; 17} 18
バリデーションの挙動
パスワードリセットには2種類のバリデーションがあるようで、内部のバリデーションを制御できずに困っています。
オーバーライドしたrulesメソッドは、tokenやemailの形式が正しいかのみバリデーションしています。
'token' => 'required', 'email' => 'required|email', 'password' => 'required|confirmed|min:8',
tokenやメールアドレスが一致しているかは内部でバリデーションしているようです。
ここが問題でpasswordに関しても内部でバリデーションを行っているようです。
上記のオーバーライドした状態で8文字未満のパスワードを入力すると、なぜかemailのエラーになります。エラーメッセージが英語なので、制御できない内部のバリデーションに引っかかっている状態です。at least six charactersになってる理由も謎です...
PHP
1/* 2 resources\views\auth\passwords\reset.blade.php 3 8文字未満のパスワードを入力 4*/ 5 6{{ $errors->first('email') }} 7// "Passwords must be at least six characters and match the confirmation." 8 9{{ $errors->first('password') }} 10// ""
8文字以上入力した上でconfirmedを不一致にしてみると、オーバーライドした独自バリデーションによって制御されます。
PHP
1/* 2 resources\views\auth\passwords\reset.blade.php 3 8文字以上入力した上でconfirmedが不一致 4*/ 5 6{{ $errors->first('email') }} 7// "" 8 9{{ $errors->first('password') }} 10// "一致しません"
挙動を見る限り、内部のバリデーションを優先的にチェックしてエラー文を表示しています。
- 内部のpasswordバリデーションに引っかかるとemailのエラーになる
- 内部のバリデーションは最低8文字のはずなのにエラー文が at least six characters になる
といった挙動になる理由がわかりません。
またどうすれば内部のバリデーションを制御できますか?
回答1件
あなたの回答
tips
プレビュー