<?php
namespace App\EventSubscriber;
use App\Entity\ElCourseRating;
use Doctrine\ORM\EntityManagerInterface;
use App\Event\ElCourseRatingPreRemoveEvent;
use App\Event\ElCourseRatingPostUpdateEvent;
use App\Event\ElCourseRatingPostPersistEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ElCourseRatingSubscriber implements EventSubscriberInterface
{
public function __construct(
private EntityManagerInterface $_em
) {
}
public static function getSubscribedEvents(): array
{
return [
ElCourseRatingPostPersistEvent::NAME => 'onPostCreate',
ElCourseRatingPostUpdateEvent::NAME => 'onPostUpdate',
ElCourseRatingPreRemoveEvent::NAME => 'onPreRemove'
];
}
public function onPostCreate(ElCourseRatingPostPersistEvent $event)
{
$this->updateTotalRatings($event);
}
public function onPostUpdate(ElCourseRatingPostUpdateEvent $event)
{
$this->updateTotalRatings($event);
}
public function onPreRemove(ElCourseRatingPreRemoveEvent $event)
{
$this->updateTotalRatings($event, true);
}
private function updateTotalRatings($event, $isExclude = false)
{
$object = $event->getObject();
$elCourse = $object->getElCourse();
$excludeId = $isExclude ? $object->getId() : null;
$result = $this->_em->getRepository(ElCourseRating::class)->getRatingStat($elCourse, $excludeId);
$elCourse
->setTotalRating($result['totalRating'])
->setAverageRating($result['averageRating'])
;
$this->_em->persist($elCourse);
$this->_em->flush();
}
}