<?php
namespace App\EventSubscriber;
use App\Entity\NewsfeedVoteAnswer;
use Doctrine\ORM\EntityManagerInterface;
use App\Event\NewsfeedVoteAnswerPreRemoveEvent;
use App\Event\NewsfeedVoteAnswerPostPersistEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class NewsfeedVoteAnswerSubscriber implements EventSubscriberInterface
{
public function __construct(
private EntityManagerInterface $_em
) {}
public static function getSubscribedEvents(): array
{
return [
NewsfeedVoteAnswerPostPersistEvent::NAME => 'onPostPersist',
NewsfeedVoteAnswerPreRemoveEvent::NAME => 'onPreRemove',
];
}
public function onPostPersist(NewsfeedVoteAnswerPostPersistEvent $event)
{
$this->calculateTotalVote($event->getObject());
}
public function onPreRemove(NewsfeedVoteAnswerPreRemoveEvent $event)
{
$this->calculateTotalVote($event->getObject(), true);
}
private function calculateTotalVote(NewsfeedVoteAnswer $newsfeedVoteAnswer, $isRemove = false)
{
$newsfeed = $newsfeedVoteAnswer->getNewsfeed();
$totalVotes = $this->_em->getRepository(NewsfeedVoteAnswer::class)
->getTotalVotes($newsfeed);
$votesByOption = [];
if ($totalVotes) {
foreach ($totalVotes as $tv) {
$votesByOption[$tv['opt']] = $isRemove ? ($tv['total']-1) : $tv['total'];
}
}
$newsfeed->setVoteResult($votesByOption);
$this->_em->persist($newsfeed);
$this->_em->flush();
}
}