Partage
  • Partager sur Facebook
  • Partager sur Twitter

SF5 - Mettre à jour un entité avec un écouteur

Sujet résolu
    30 novembre 2020 à 16:36:10

    Bonjour,

    Voici ma problématique : j'ai besoin de mettre à jour mon entité Event (la date de début et la date de fin plus exactement) si cet événement est arrivé à expiration (on le programme alors pour l'année prochaine à la même période).

    Par exemple j'ai un événement du 01/11/2020 au 29/11/2020, on est le 30/11/2020 donc il est dépassé, alors on le reprogramme du 01/11/2021 au 29/11/2021. Et cela doit se faire automatiquement.

    Pour faire cela j'ai donc mis en place un listener. Cependant cela ne fonctionne pas, je ne vois pas où peut se situer l'erreur.

    Mon Listener :

    <?php
    namespace App\Listener;
    
    use App\Entity\Event\Event;
    use App\Repository\Event\EventRepository;
    use Doctrine\ORM\EntityManagerInterface;
    use Symfony\Component\HttpKernel\Event\ControllerEvent;
    
    /**
     * Listener that updates startDate and endDate if events is recurrent
     */
    class EventListener
    {
        private $entityManager;
        private $eventRepository; 
    
        public function __construct(EntityManagerInterface $entityManager, EventRepository $eventRepository)
        {
            $this->entityManager = $entityManager;
            $this->eventRepository = $eventRepository;
        }
    
        /**
        * Updates startDate and endDate if events is recurrent on each request
        * @param ControllerEvent $controllerEvent
        */
        public function onCoreController(ControllerEvent $controllerEvent)
        {
            // Check that the current request is a "MASTER_REQUEST"
            // Ignore any sub-request
            
            if (!$controllerEvent->isMasterRequest()) {
                return;
            }
    
            $events = $this->eventRepository->findRecurrentEventsEachYear();
    
            foreach ($events as $event) {
    
                if ($event instanceof Event) {
    
                    $event['startDate']->modify('+ 1 year');
                    $event->setStartDate($event['startDate']);
    
                    $event['endDate']->modify('+ 1 year');
                    $event->setEndDate($event['endDate']);
    
                    $this->entityManager->persist($event);
                    $this->entityManager->flush();
                }
            }
        }
    }

    Ma méthode

    findRecurrentEventsEachYear()

    fonctionne bien, elle me récupère bien tous les événements qui sont dépassés de date.

    J'ai déclaré mon listener dans services.yaml :

    # Listener
        
        App\Listener\EventListener:
            tags:
                - { name: kernel.event_listener, event: kernel.controller, method: onCoreController }

    Donc voilà, peut-être une étape que j'ai omise ?

    Merci pour votre aide.



    • Partager sur Facebook
    • Partager sur Twitter
      2 décembre 2020 à 13:15:06

      Un EventListener est appelé, quand un Event est arrivé.

      Dans ton cas quand la date est dépassé. Mais ton code il est pas exécuté h24.

      Il faut un CRON qui check tous les jours, heure ou minute les Events qui sont arrivés à termes et ensuite faire le changement.

      Ou encore le faire quand quelqu'un accède à une page pour faire au fil de l'eau.

      -
      Edité par skuti 2 décembre 2020 à 13:15:49

      • Partager sur Facebook
      • Partager sur Twitter
      $2b||!$2b
        2 décembre 2020 à 14:14:24

        Bonjour,

        Comme dit par skuti il n'y a pas de magie et il faut un déclencheur à un EventListener selon les 2 formules proposées.

        Pour ce type de besoin qui ne requiert pas d'interactif moi j'utilise une console command : https://symfony.com/doc/current/console.html#creating-a-command

        déclenchée par un cron. La commande met à jour directement les objets qui répondent aux critères.

        Le listener ne s'impose pas à mon avis dans ce cas.

        A+

        -
        Edité par monkey3d 2 décembre 2020 à 14:15:58

        • Partager sur Facebook
        • Partager sur Twitter
          3 décembre 2020 à 11:03:25

          D'accord merci pour vos conseils.

          Cependant mon erreur était dans le fait que je pose la question si mon event est une instance d'event, et dans mon cas ce n'est pas le cas.

          • Partager sur Facebook
          • Partager sur Twitter

          SF5 - Mettre à jour un entité avec un écouteur

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown