そもそもの仕様
Laravelでログインする対象カラム (デフォルトはemail
)は、AuthenticatesUsers::username
で一元管理されている
Auth\LoginController
ではAuthenticatesUsers
トレイトを利用しているので、
オーバーライド(=設定の上書き)が可能
ログインする対象のカラムをlogin_idに変更する
- Auth\LoginController.phpに
username
メソッドを記載
<?php
// (省略)
public function username()
{
// ⭐️ emailの代わりに使用したいカラム名を指定する
return 'login_id';
}
これでオーバーライドされてlogin_id
カラムがチェック対象になる
emailでもlogin_idでもログインさせたい場合
AuthenticatesUsers::attemptLogin
をオーバーライドする
- Auth\LoginController.phpに
attemptLogin
メソッドを追記
<?php
// (省略)
protected function attemptLogin(Request $request)
{
$username = $request->input($this->username());
$password = $request->input('password');
if (filter_var($username, \FILTER_VALIDATE_EMAIL)) {
$credentials = ['email' => $username, 'password' => $password];
} else {
$credentials = [$this->username() => $username, 'password' => $password];
}
return $this->guard()->attempt($credentials, $request->filled('remember'));
}
LoginControllerでuse Illuminate\Http\Request;
を記載していない場合はこれも追記
解説
if (filter_var($username, \FILTER_VALIDATE_EMAIL))
で、入力された値( = $username
)がメールアドレス形式かどうかを判定している
結果がtrueの場合はemail
カラムを、
falseの場合はusername
メソッドで上書きしたカラムを見に行くように条件分岐してる
Laravelではemailログインがデフォルトだけど、
ログインIDなど他のカラムでログインしたい場合もある