Laravel 6

Objet en session et notifications

Avatar de Gabriel
Gabriel

Bonsoir,

Je développe actuellement une plateforme sur laquelle chaque utilisateur incarne un personnage. Chaque utilisateur pouvant avoir plusieurs personnages, je stocke le personnage actuellement incarné par l'utilisateur dans une variable de session afin de ne pas avoir à récupérer les informations en base de données à chaque fois.

Seulement voilà, les notifications sont basées, de fait, sur le personnage incarné et pas sur l'utilisateur.

Le soucis qui se pose est le suivant :

Lorsque je tente d'accéder aux notifications (Session::get('Character'))->unreadNotifications) ça semble enregistrer les notifications dans la session et je ne peux plus les recharger sans recharger complètement la session.

Sauriez-vous comment contourner ce problème ?

D'avance merci,

Posté il y a 2 mois
Avatar de bestmomo
bestmomo

Salut,

Le système de notification de Laravel est relié à un ou plusieurs modèles Eloquent, il suffit d'ajouter le trait dans le modèle. S'il y a un modèle Character ça devrait fonctionner. Les notifications ne sont pas enregistrées en session, on peut seulement les mémoriser dans la base de données.

Posté il y a 2 mois
Avatar de Gabriel
Gabriel

Salut momo,

Merci pour ta réponse, mais le problème ne se situe pas là :p

Je vais expliquer au mieux... je parviens sans problème à récupèrer les notifications dans ma vue en faisant

Session::get('Character'))->unreadNotifications

Seulement, quelque soit les opérations qui interveinennt après (notification lue, suppression de notification, ajout de notficiation) rien y fait je ne parvient pas à récupèrer ces modifications. Comme si les notifications étaient inscritent dans l'objet en session la première fois et que laravel ne se contentait que de récupèrer la valeur stockée en session ensuite sans recharger les modifications.

D'ailleurs après vérification je confirme, au premier appel de la fonction laravel enregistre les notifications sur l'objet stocké en session et ne récupère plus les informations en session...

Posté il y a 2 mois
Avatar de Gabriel
Gabriel

Quelqu'un d'autre aurait une idée ? Un moyen pour ne pas avoir à réécrire un système de notification existant..?

Posté il y a 2 mois
Avatar de CinquièmeDimension
CinquièmeDimension

Salut,

Si je comprends bien tu veux récupérer seulement les unreadNotifications que tu n'as pas déjà ? Dans ce cas, tu peux essayer de bidouiller un truc genre:

  • Tu recupere tous les id de notif que tu as déjà en session
  • Tu balance ça dans une fonction qui va te récupérer les unreadNotifications à l'exception des id que tu lui a donné
  • Tu array_push dans ta session Character['unreadNotifications'] where Character['id'] == user.id

Un truc comme ça. Mais sauf si le user à vraiment plein de notif, ca va prendre aussi longtemps que de tout retélécharger.

Et si c'est pas ça que tu voulais faire, ben j'ai pas compris :)

Posté il y a 2 mois
Avatar de Gabriel
Gabriel

Hello !

Non, c'est pas tout à fait ça :p

Le problème est que les notifications sont enregistrés dans l'objet en session au premier appel et que tous les appels qui suivent ne font que récupèrer les notifications en session sans aller vérifier la base de données... autrement dit voilà ce qui se passe :

  • Je charge la page et récupère mes deux notifications
  • Je supprime une notifications (elle disparait de la base de données, il m'en reste donc bien une) et recharge la page
  • J'ai toujours mes deux notifications (celles-ci étant enregistrées comme attributs de l'objet en session) et, à moins de vider la session, laravel ne va pas récupèrer les notifications en base de données et se contente des informations stockés sur l'objet en session au premier appel de la page

L'image que j'ai envoyé plus haut, c'est une capture d'écran de mon objet en session dans telescope... on voit qu'il y a bien un attribut unread_notifications qui ne devrait pas être là...

Posté il y a 2 mois
Avatar de bestmomo
bestmomo

En fait tu détournes le fonctionnement des notifications. Tu mémorises ton modèle en session en embarquant les notifications mais évidemment Laravel ne vas pas modifier cet objet en session pour les modifications ultérieures. Puisque tu crées cet objet séparé il faut aussi prévoir l'intendance pour sa mise à jour.

Posté il y a 2 mois
Avatar de Gabriel
Gabriel

Donc avec ce fonctionnement (objet enregistré en session) je n'ai pas d'autre choix que de modifier le système de notifications c'est bien ça ? :(

Posté il y a 2 mois
Avatar de bestmomo
bestmomo

A moins de pouvoir recréer une instance du modèle avec les notifications attachées avant de faire une modification...

Posté il y a 2 mois

Vous ne pouvez pas répondre à ce sujet.