2017-03-27 2 views
1

J'essaie de gérer des sessions/événements avec Laravel mais je ne suis pas sûr de vraiment comprendre.Comment gérer les événements dans Laravel 5

J'ai un objet avec une date d'expiration stockée dans ma base de données. Je voudrais changer son état lorsque l'heure actuelle est égale à la date d'expiration. Dois-je utiliser des variables d'écouteurs/événements ou de sessions ou autre chose?

Même problème avec mon panier. Je voudrais vider le chariot après 15min d'inactivité (j'utilise Crinsane Cart).

Des idées?

Cordialement,

Jeremy

+0

Les chances sont que vous voulez probablement un cron pour la première chose. En ce qui concerne la vidange du chariot, je ne sais pas pourquoi vous voudriez cela mais vous pouvez envelopper un middleware autour des routes qui vérifie si la dernière activité du panier est> (temps - (60 * 15)) – Ian

Répondre

0

Vous pouvez créer scheduled task pour cela. Vérifiez tous les enregistrements qui ont expiré et mettez à jour l'état:

Model::where('status', 0) 
    ->where('expiration_date', '<', Carbon::now()) 
    ->update(['status' => 1]); 

Puis ajoutez la tâche. Par exemple, si vous voulez exécuter cette tâche chaque minute:

$schedule->command(status:update)->everyMinute(); 
+0

Merci beaucoup pour cette réponse. Cela devrait fonctionner parfaitement. Mais si je veux détecter automatiquement le changement de l'état, est-ce possible? Car exécuter une tâche toutes les minutes peut être lourd? –

+0

@ JérémyAublanc vous ne pouvez pas le faire automatiquement. Ce que vous pouvez faire est de faire la vérification avec chaque demande, mais l'exécution de la tâche planifiée est tellement mieux. –

0

Cela ressemble à un problème qui pourrait facilement être traitée à l'aide de Task Scheduling Laravel lui-même.

Vous auriez besoin de deux emplois:

  • Les premiers besoins à cuire tous les jours (je suppose) et exécuter une requête pour sélectionner tous les objets dont la date de experiation est expirée. (Voir la réponse de Alexey pour la requête)

  • Le second a besoin de vérifier wether un panier a été inactif pendant plus de 15 minutes et le supprimer si elle est comme ceci:

Cart::where('updated_at, '<', Carbon::now()->subMinutes(15))->delete();

+0

Pour le cas de chariot, êtes-vous sûr que je peux faire cela? Parce que le "timer" doit être exécuté lorsque l'utilisateur ajoute son premier objet et est vide après 15min de panier impayé. Ne vaut-il pas mieux utiliser la variable de session (stocker pour chaque utilisateur). Je suis vraiment confus avec cette affaire ... –

+0

Peut-être en utilisant l'événement en disant «Je viens d'ajouter un élément dans mon panier ..»? –

+0

Cela dépend du type de comportement que vous souhaitez créer sur votre site Web. Voulez-vous supprimer un panier inactif depuis longtemps ou lorsque l'utilisateur fait des achats trop long? Si je vous, je voudrais exécuter une requête quotidienne qui supprime les chariots de plus de 24 heures, de sorte que vous ne supprimez jamais un panier qui est utilisé par un utilisateur à ce moment. –