はじめに
Laravelの標準のAuthのパスワードリセットでは、emailのカラムを元にリセットを行いますが、別のカラムを元にリセットをしたい場合など、パスワードリセットの機能をオーバーライドする必要が出てきます。
今回はパスワードリセットの機能についてつまづいた部分を書き留めておきたいと思います。
なお、本記事ではemailではなくmail_addressというカラムを使って実装していますので、適宜置き換えて実装してもらえればと思います。
使用しているLaravelのバージョンは5.7.29です。
ForgotPasswordControllerのオーバーライド
emailではなくmail_addressというカラムを使うようにForgotPasswordControllerのオーバーライドします。
email.blade.phpで送られるパラメータをmail_addressに変更します。
<form method="POST" action="{{ route('password.email') }}">
@csrf
<div class="form-group">
<label for="mail_address">{{ __('メールアドレス') }}</label>
{{ Form::text('mail_address', null, ['class' => 'form-control']) }}
@if ($errors->has('mail_address'))
<span class="invalid-feedback" role="alert">
<strong>{{ $errors->first('mail_address') }}</strong>
</span>
@endif
</div>
{{ Form::submit(__('送信'), ['class' => 'btn btn-primary']) }}
</form>
mail_addressの項目を使うようにsendResetLinkEmailをオーバーライドします。
public function sendResetLinkEmail(Request $request)
{
$this->validate($request, ['mail_address' => 'required'], ['mail_address.required' => 'メールアドレスを入力してください。']);
$response = $this->broker()->sendResetLink(
$request->only('mail_address')
);
if ($response === Password::RESET_LINK_SENT) {
return back()->with('status', trans($response));
}
return back()->withErrors(
['mail_address' => trans($response)]
);
}
ここまでで、リクエストパラメータのバリデーションとユーザー検索の処理を mail_address
を使って行えようになります。
次に password_resets
テーブルにinsertするパラメータの取得を email
から mail_address
に変更します。
public function getEmailForPasswordReset() {
return $this->mail_address;
}
最後にメール送信するパラメータの取得を変更します。
public function routeNotificationForMail() {
return $this->mail_address;
}
これでメール送信までできるようになりました。
ResetPasswordControllerのオーバーライド
最後にパスワード変更を行なっているメソッドのをしていきます。
下記のようにreset.blade.phpで送るパラメータをmail_addressに変更します。
<input type="hidden" name="mail_address" value="{{ $email ?? old('email') }}" required autofocus>
ResetPasswordControllerのcredentialsをオーバーライドしてmail_addressを元にユーザーの検索を行うようにします。
protected function credentials(Request $request)
{
return $request->only(
'mail_address', 'password', 'password_confirmation', 'token'
);
}
これだけだとemailのバリデーションに引っかかるので、バリデーションのルールをオーバーライドします。
protected function rules()
{
return [
'token' => 'required',
'mail_address' => 'required|email',
'password' => 'required|confirmed',
];
}
これで、emailではなくmail_addressを使って機能するパスワードリセットの実装ができました。