
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>