ログインして操作をしているオンライン状態 と、そうでないオフライン状態
を簡単に
判定できる仕組みを実装する。
WebRTCとかを使ったチャット とかと併用すると良いかもしれない。
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は書かなくて済むし、
キャッシュは勝手にキャッシュコントローラーが消してくれるので、スッキリしそう。