ログイン時に追加処理をするためのメモ。
前提
バージョン:Laravel6
LoginControlerの中身
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
}
デフォルトの状態ではログインコントローラーは上のようになっている。
今回重要なのはuse AuthenticatesUsers;
。ログイン時の処理内容も本体はこのAuthenticatesUsers
トレイトの中にある。
AuthenticatesUsers
はvendor/laravel/framework/Illuminate/Foundation/Auth
の中にある。
public function login(Request $request)
{
/* 割愛 */
if ($this->attemptLogin($request)) {
return $this->sendLoginResponse($request);
}
/* 割愛 */
}
protected function sendLoginResponse(Request $request)
{
/* 割愛 */
return $this->authenticated($request, $this->guard()->user())
?: redirect()->intended($this->redirectPath());
}
protected function authenticated(Request $request, $user)
{
//
}
AuthenticatesUsers
の中を見るとlogin
ではログインをする(attemptLogin
)ときにsendloginResponse
が呼び出されている。
さらにsendloginResponse
ではauthenticated
とredirect()...
が三項演算子?:
で比較されている。
つまり、authenticated
を実行してその返り値が存在しない、またはfalse
の場合はredirect()...
でログイン先のページへと移動する。
このauthenticated
は中身が空なのでLoginController
側で上書きすればログイン実行時の処理を追加できる。
なお、$request
はログインフォームの入力値、$user
はログインしたユーザーが入る。
返り値があればredirect()...
は実行されないので、ユーザーごとにログイン先を変えるといった処理も可能。
注意点として、use Illuminate\Http\Request;
も追記しないとLoginController
側でRequest
が呼び出だせずエラーになってしまう。
サンプル ログイン時の時間を記録する
users
テーブルにlogin_at
カラムを追加してユーザーごとにログインした時間を記録する。
①マイグレーション
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->dateTime('login_at')->nullable();
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('login_at');
});
}
②コントローラー
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request; // 追記
/* 割愛 */
protected function authenticated(Request $request, $user)
{
$user->login_at = now();
$user->save();
}