<?php
namespace App\EventSubscriber;
use App\Message\SearchIndexUpdateMessage;
use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\PostPersistEventArgs;
use Doctrine\ORM\Event\PostUpdateEventArgs;
use Doctrine\ORM\Event\PostRemoveEventArgs;
use Doctrine\ORM\Events;
use Symfony\Component\Messenger\MessageBusInterface;
class SearchIndexSubscriber implements EventSubscriber
{
/** @var MessageBusInterface */
private $bus;
public function __construct(MessageBusInterface $bus)
{
$this->bus = $bus;
}
public function getSubscribedEvents(): array
{
return [
Events::postPersist,
Events::postUpdate,
Events::postRemove,
];
}
public function postPersist(PostPersistEventArgs $args): void
{
$this->dispatch($args->getObject(), SearchIndexUpdateMessage::ACTION_UPSERT);
}
public function postUpdate(PostUpdateEventArgs $args): void
{
$this->dispatch($args->getObject(), SearchIndexUpdateMessage::ACTION_UPDATE);
}
public function postRemove(PostRemoveEventArgs $args): void
{
$this->dispatch($args->getObject(), SearchIndexUpdateMessage::ACTION_REMOVE);
}
private function dispatch(object $entity, string $action): void
{
$id = method_exists($entity, 'getId') ? $entity->getId() : null;
if ($id) {
$this->bus->dispatch(new SearchIndexUpdateMessage(get_class($entity), $id, $action));
}
}
}