src/EventSubscriber/NewsfeedVoteAnswerSubscriber.php line 30

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\NewsfeedVoteAnswer;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use App\Event\NewsfeedVoteAnswerPreRemoveEvent;
  6. use App\Event\NewsfeedVoteAnswerPostPersistEvent;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. class NewsfeedVoteAnswerSubscriber implements EventSubscriberInterface
  9. {
  10.     public function __construct(
  11.         private EntityManagerInterface $_em
  12.     ) {}
  13.     public static function getSubscribedEvents(): array
  14.     {
  15.         return [
  16.             NewsfeedVoteAnswerPostPersistEvent::NAME => 'onPostPersist',
  17.             NewsfeedVoteAnswerPreRemoveEvent::NAME => 'onPreRemove',
  18.         ];
  19.     }
  20.     public function onPostPersist(NewsfeedVoteAnswerPostPersistEvent $event)
  21.     {
  22.         $this->calculateTotalVote($event->getObject());
  23.     }
  24.     public function onPreRemove(NewsfeedVoteAnswerPreRemoveEvent $event)
  25.     {
  26.         $this->calculateTotalVote($event->getObject(), true);
  27.     }
  28.     private function calculateTotalVote(NewsfeedVoteAnswer $newsfeedVoteAnswer$isRemove false)
  29.     {
  30.         $newsfeed $newsfeedVoteAnswer->getNewsfeed();
  31.         $totalVotes $this->_em->getRepository(NewsfeedVoteAnswer::class)
  32.             ->getTotalVotes($newsfeed);
  33.         $votesByOption = [];
  34.         if ($totalVotes) {
  35.             foreach ($totalVotes as $tv) {
  36.                 $votesByOption[$tv['opt']] = $isRemove ? ($tv['total']-1) : $tv['total'];
  37.             }
  38.         }
  39.         $newsfeed->setVoteResult($votesByOption);
  40.         $this->_em->persist($newsfeed);
  41.         $this->_em->flush();
  42.     }
  43. }