LoginSignup
4
1

More than 1 year has passed since last update.

Laravelのパスワードリセットをemail以外のカラムで行うようにする

Posted at

はじめに

Laravelの標準のAuthのパスワードリセットでは、emailのカラムを元にリセットを行いますが、別のカラムを元にリセットをしたい場合など、パスワードリセットの機能をオーバーライドする必要が出てきます。
今回はパスワードリセットの機能についてつまづいた部分を書き留めておきたいと思います。

なお、本記事ではemailではなくmail_addressというカラムを使って実装していますので、適宜置き換えて実装してもらえればと思います。

使用しているLaravelのバージョンは5.7.29です。

ForgotPasswordControllerのオーバーライド

emailではなくmail_addressというカラムを使うようにForgotPasswordControllerのオーバーライドします。

email.blade.phpで送られるパラメータをmail_addressに変更します。

resources/views/auth/passwords/email.blade.php
<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をオーバーライドします。

app/Http/Controllers/Auth/ForgotPasswordController.php
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 に変更します。

app/User.php
public function getEmailForPasswordReset() {
    return $this->mail_address;
}

最後にメール送信するパラメータの取得を変更します。

app/User.php
public function routeNotificationForMail() {
    return $this->mail_address;
}

これでメール送信までできるようになりました。

ResetPasswordControllerのオーバーライド

最後にパスワード変更を行なっているメソッドのをしていきます。

下記のようにreset.blade.phpで送るパラメータをmail_addressに変更します。

resources/views/auth/passwords/reset.blade.php
<input type="hidden" name="mail_address" value="{{ $email ?? old('email') }}" required autofocus>

ResetPasswordControllerのcredentialsをオーバーライドしてmail_addressを元にユーザーの検索を行うようにします。

app/Http/Controllers/Auth/ResetPasswordController.php
protected function credentials(Request $request)
{
    return $request->only(
        'mail_address', 'password', 'password_confirmation', 'token'
    );
}

これだけだとemailのバリデーションに引っかかるので、バリデーションのルールをオーバーライドします。

app/Http/Controllers/Auth/ResetPasswordController.php
protected function rules()
{
    return [
        'token' => 'required',
        'mail_address' => 'required|email',
        'password' => 'required|confirmed',
    ];
}

これで、emailではなくmail_addressを使って機能するパスワードリセットの実装ができました。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1