アクティブユーザーを測定したい!(Laravel)

3 min read読了の目安(約3200字

こんにちは。

今回は自分が知っている情報以外にもっと良い方法あるんじゃないかな〜〜と思いつつも、自分がい現時点で知っている方法を紹介するので、テック記事ではなくアイデア記事としています。

今回はアクティブユーザーを測定する方法について説明します。
結構シンプルな方法ですので、誰でもかんたんに実践できると思います。

アクティブユーザーを測定する

アクティブユーザーを測定する場合は、「最後にログインした日付をデータベースに入れる」もしくは、「最後に使用した日付をデータベースに入れる」のが有効です。

最後にログインした日付をデータベースにいれる

こちらは usersテーブルに last_login_at のようなカラムを追加してあげて、
ログインメソッドの中で、現在の時刻をlast_login_atに入れるという処理を追加してあげるだけです。

もしくは、こちらの記事にあるように、イベントリスナでログイン時の処理を追加するのもいいと思います。
【Laravel8系】ユーザのログイン日時を記録する

最後に使用した日付をデータベースにいれる

こちらもusersテーブルに1つカラムを付け加えます。
先程は最後のログイン日時でしたが、今回は最後に使用した日付なので、 last_used_at とかにでもしておきましょうか。

個人的には最後にログインした日付をDBに入れるのでもいいかなと思いますが、remember_meの機能をつけると一回ログインしたらずっとログイン情報を保持してくれる仕組みになっていますよね。なので本当にアクティブユーザーなのか分かりづらかったりすると思います。

その場合はmiddlewareを使用して、アクセスされたら都度DBに保存する方法があります。

①ミドルウェアを作成する

$ php artisan make:middleware UpdateLastAccessDate 

②ユーザーテーブルを更新する記述を書く

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class UpdateLastAccessDate
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $user = auth()->user();
        $user->last_used_at = now();
        $user->save();

        return $next($request);
    }
}

③Kernelに登録する

/Users/naoki/programming/for_study/app/Http/Kernel.php


    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'update_last_use_date' => \App\Http\Middleware\UpdateLastAccessDate::class, // 追記
    ]; 

④ルーティングに設定する

route/web.php を編集します。

<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::middleware(['auth', 'update_last_use_date'])->group(function () {
    // ルーティング
});

終わりに

最終ログイン日時については、usersテーブルに最終ログイン日時用のカラムを作成しControllerのログイン処理のメソッドの部分にusersテーブルを更新する記述を書く方法とイベントリスナで設定する方法を紹介しました。

また、最終使用日時に関して、ミドルウェアで毎回データベースに保存する方法を紹介しました。

毎回データベースを更新するのはいかがなものか?と個人的には気になっているので、
より良い方法がありましたら、ご教示いただきたいです!

ではまた!