LaravelでemailとLogin id(username)両方ログイン可能にする

LoginControllerにusername()を定義

formでname=“login_id” からの入力を FILTER_VALIDATE_EMAIL によってメールアドレスか否かを判断して、ログインに使うフィールドを設定します。

username()をLoginControllerに追記しましょう。

編集ファイル: app/Http/Controllers/Auth/LoginController.php

/**
 * emailかidかを判断してログイン方法のフィールドを返す
 * 
 * @return string
 */
public function username()
{
    $login = request()->input('login_id');
    $field = filter_var($login, FILTER_VALIDATE_EMAIL) ? 'email' : 'login_id';
    request()->merge([$field => $login]);
    return $field;
}

viewのold設定

ポイントとしては下記のようにlogin_idで送信しても、errorsにはemailかlogin_id、のどちらかがkeyとなって返ってくるということです。

そのため、 {{ old('login_id') ?: old('email') }} というような記述でバリデーションに失敗した時の値が入るようにしています。

Request: login_id
errors: email or login_id usernameによってnameがkeyが変わる
<!-- cssフレームワークとしてbulmaを使用しています。 -->
<div class="field">
    <div class="control has-icons-left">
        <input name="login_id" class="input is-medium {{ $errors->has('login_id') || $errors->has('email') ? ' is-danger' : '' }}" type="text" value="{{ old('login_id')  ?: old('email') }}" placeholder="Email or ID" required>
        <span class="icon is-small is-left">
            <i class="fas fa-envelope"></i>
        </span>
        @if ($errors->has('login_id') || $errors->has('email'))
            <p class="help is-danger">{{ $errors->first('login_id') ?: $errors->first('email') }}</p>
        @endif
    </div>
</div>