6
14

More than 3 years have passed since last update.

【Laravel】ユーザのオンライン状態をチェックする

Last updated at Posted at 2019-07-26

ログインして操作をしているオンライン状態 :grinning: と、そうでないオフライン状態 :sleeping: を簡単に
判定できる仕組みを実装する。
WebRTCとかを使ったチャット :speech_balloon: とかと併用すると良いかもしれない。

1.新しいプロジェクトを作る

作り方はここら辺を参照。以下のコマンドまでは終わらせておく。

php artisan migrate

2.ミドルウェアを作る。

このコマンドで LastUserActivity というミドルウェアを作る。

php artisan make:middleware LastUserActivity

ユーザがオンラインかを判断するコードを加える。

App\Http\Middleware\LastUserActivity .php

<?php

namespace App\Http\Middleware;

use Closure;
use Auth;
use Cache;
use Carbon\Carbon;
class LastUserActivity
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(Auth::check()) {
            $expiresAt = Carbon::now()->addMinutes(1);
            Cache::put('user-is-online-' . Auth::user()->id, true, $expiresAt);
        }
        return $next($request);
    }
}

3.カーネルにクラスを追加する

カーネルファイルの middlewareGroups にクラスを追加する。
\App\Http\Middleware\LastUserActivity::class,

protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,

+             \App\Http\Middleware\LastUserActivity::class,
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];

4.ユーザモデルに関数を追加する。

use Cache;
   :

public function isOnline()
{
    return Cache::has('user-is-online-' . $this->id);
}

5.ララベルアプリケーションでユーザがオンラインかオフラインかをチェックする。

@if($user->isOnline())
    user is online!!
@endif

仕組みとしては、

  • ミドルウェアを通るとキャッシュが更新される。
  • キャッシュがあるうちはオンラインとして判断する。
  • サンプルは1分を目安に設定しているので、1分以上操作がないとオフラインになる。

キャッシュを使ったステータス管理は他にも応用できそう。

有効期限のチェックとかをする場合、

  • 方法1
    テーブルに有効期限フィールドを追加して、書き込み、読み込み、判定、更新しても良いけれど・・・
  • 方法2
    有効期限までのキャッシュを書き込み、それの有無を判断すれば、
    フィールド追加も要らないし、CRUDは書かなくて済むし、
    キャッシュは勝手にキャッシュコントローラーが消してくれるので、スッキリしそう。

参考:How to Check User online or not in Laravel

6
14
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
14