【Laravel6】最終ログイン日時をデータベースに保存する方法

Laravel

スポンサーリンク

LaravelのAuthのログインイベントを使用して最終ログイン日時をデータベースに保存する方法を紹介します。

カラム追加

まずはUsersテーブルのマイグレーションファイルに最終ログイン日時保存用のカラムを追加してmigrationを行う。

[database/migrations/yyyy_mm_dd_000000_create_users_table.php]※一部抜粋

    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            // 省略
            $table->timestamp('last_login_at')->nullable();
        });
    }

イベントとリスナークラスを作成

EventServiceProvider.phpにイベントクラスと対応するリスナーを定義する。

※LaravelのAuth機能にはデフォルトで、Illuminate\Auth\Events\Loginクラスがあり、このイベントクラスを使ってリスナーを設定すれば、ログイン成功時に任意の処理を追加できる。

※そのほかにデフォルトで用意されているイベントクラスは以下を参照

https://readouble.com/laravel/6.x/ja/authentication.html#events

[app/Providers/EventServiceProvider.php]

    protected $listen = [
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
        // ログイン成功時(vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.phpのfireLoginEventで発火処理)
        'Illuminate\Auth\Events\Login' => [
            'App\Listeners\LogSuccessfulLogin',
        ],

    ];

以下のコマンドで、EventServiceProvider.phpに定義したイベントとリスナのクラスを作成

php artisan event:generate

Illuminate\Auth\Events\Loginは今回はもともとあるので作成されない。

App\Listeners\LogSuccessfulLoginは新しく作成される。

イベント発火時の処理を追加

LogSuccessfulLogin.phpにログインイベントが発火された時に行う処理を記載する。

[app/Listeners/LogSuccessfulLogin.php]※一部抜粋

    public function handle(Login $event)
    {
        // 最終ログイン日時の保存
        $event->user->last_login_at = now();
        $event->user->save();
    }

 

これで、ログインが成功した際に、最終ログイン日時が保存される。

Laravel

Posted by ton