Maison  >  Article  >  cadre php  >  Laravel implémente la fonction de suivi si l'utilisateur est en ligne

Laravel implémente la fonction de suivi si l'utilisateur est en ligne

藏色散人
藏色散人avant
2020-01-30 20:57:282615parcourir

Laravel implémente la fonction de suivi si l'utilisateur est en ligne

Utiliser une méthode simple dans Laravel pour savoir si l'utilisateur est en ligne

Aujourd'hui, ma tâche est d'utiliser Application Laravel Sur la page de profil utilisateur du programme, un point vert est ajouté à côté du nom d'utilisateur pour indiquer s'il est en ligne.

Ma première pensée est que nous devrons démarrer un serveur node.js et garder une trace des connexions socket actives pour chaque utilisateur. Ensuite, en utilisant le socket utilisateur actuellement connecté, nous pouvons mettre à jour le statut en ligne en temps réel !

Le seul problème est que c'est un peu exagéré pour nos besoins actuels et pas entièrement nécessaire tant que nous n'aurons pas de fonctionnalités qui nécessitent un deuxième niveau de précision, comme le chat en direct.

Un collègue a souligné que la façon dont MySpace gère les fonctionnalités « en ligne » pourrait être suffisante pour les besoins actuels. À notre connaissance, la façon dont MySpace indique si un utilisateur est en ligne est basée sur sa dernière activité sur le site.

Si leur dernière activité a duré X minutes, nous afficherons un badge « En ligne », sinon, nous ne le ferons pas. Simple!

Ajoutons un champ à la table des utilisateurs pour la dernière activité de l'utilisateur et mettons-le à jour à chaque demande de page. Ensuite, lorsque nous devons vérifier si l'utilisateur est en ligne, nous pouvons comparer cet horodatage à l'horodatage actuel et si c'est dans X minutes, alors il est en ligne !

Bien que cela puisse fonctionner correctement, selon l'application que vous créez, cela ajoutera des écritures inutiles à la base de données, ce qui ralentira quelque peu votre application.

Un bon compromis est de stocker ces informations dans le cache de l'application. L’avantage de la mise en cache est que cette approche peut être simplifiée car le cache peut être configuré pour expirer.

Maintenant que nous avons décidé d'implémenter cette fonctionnalité à l'aide de la mise en cache, la question suivante est de savoir où ce code doit s'exécuter pour qu'il s'exécute à chaque requête ? J'ai deux idées à mettre en œuvre :

Créez un BaseController et laissez tous vos Controller en hériter

Créez un middleware

Après y avoir réfléchi, et réalisant que je devais ajouter un appel au constructeur parent à tous les constructeurs que j'ai écrits, j'ai choisi de l'implémenter dans un middleware.

Nous avons un plan, passons au code !

Tout d’abord, nous devons créer un middleware. Entrez la commande suivante dans le terminal :

php artisan make:middleware LogLastUserActivity

Ensuite, nous ouvrons le fichier php suivant

app/Http/Middleware/LogLastUserActivity.php.

et ajoutons le code suivant dans la méthode handle :

 if(Auth::check()) {
$expiresAt = Carbon::now()->addMinutes(5);
 Cache::put('user-is-online-' . Auth::user()->id, true, $expiresAt);
 }

Ensuite, nous ouvrons le fichier app/Http/Kernel.php. Si vous utilisez Laravel 5.1 ou une version antérieure, vous devez placer votre code directement dans le tableau $middleware. Si votre version est 5.2.*, vous devez placer le code dans $middlewareGroups of web.

Notez que le code doit être placé en dessous du middleware StartSession, sinon la façade Auth ne se connectera pas correctement à l'utilisateur. Mes paramètres de configuration de mise à jour sont les suivants :

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,
  \App\Http\Middleware\LogLastUserActivity::class,
  ],
 'api' => [
 'throttle:60,1',
 ],
 ];

La dernière étape consiste à ajouter une méthode à notre objet utilisateur pour détecter cette valeur.

Dans app/User.php, nous ajoutons la méthode suivante :

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

Maintenant, dans n'importe quelle page, vous pouvez ajouter la méthode suivante :

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

Important - assurez-vous d'utiliser use en haut de vos fichiers pour inclure toutes les façades !

J'espère que cela vous aidera à résoudre ce problème !

Pour des articles plus techniques liés au framework laravel, veuillez visiter la colonne tutoriel laravel !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer