I have made custom middleware to track user online status but it has an issue, I can see my own online status but I always see other users as offline while they are not.
Code
Middleware
class UserActivity
{
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(Auth::check()){
$expiresAt = Carbon::now()->addMinute(1);
Cache::put('user-is-online-' . Auth::user()->id, true, $expiresAt);
}
return $next($request);
}
}
Kernel.php
'web' => [
//...
AppHttpMiddlewareUserActivity::class,
],
User.php (model)
public function isOnline()
{
return Cache::has('user-is-online-' . $this->id);
}
views
@if($user->isOnline())
Online
@else
Offline
@endif
Any idea why other users status is always not correct?
PS:
I’m open to livewire solution if any 🙂
Advertisement
Answer
After digging in the chat we have resolved the issues;
Cache driver issue
Instead of using CACHE_DRIVER=array
you have to use CACHE_DRIVER=file
Reason : array
is used for testing purpose only and the state will not be persisted in cache between requests.
Livewire key issue
You have use <livewire:my-component key="UNIQUE_ID" />
or <div wire:key="UNIQUE_ID"></div>
when the content is inside a foreach
or if
condition and updated by livewire.
Livewire keeps reference of them to update the DOM. Without, Livewire may update the wrong place.