point-tools/src/EventListener/UsersUpdatedSubscriber.php

70 lines
2.0 KiB
PHP
Raw Normal View History

2016-03-29 00:12:52 +00:00
<?php
declare(strict_types=1);
2016-03-29 00:12:52 +00:00
namespace App\EventListener;
2016-03-29 00:12:52 +00:00
use App\Event\UsersRenamedEvent;
2016-03-29 00:12:52 +00:00
use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\PostFlushEventArgs;
use Doctrine\ORM\Event\PreUpdateEventArgs;
use App\Entity\{User, UserRenameEvent, UserRenameEvent as RenameEventEntity};
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
2016-03-29 00:12:52 +00:00
// For new doctrine: https://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html#creating-the-subscriber-class
//use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
//use Doctrine\Common\Persistence\Event\PreUpdateEventArgs;
class UsersUpdatedSubscriber implements EventSubscriber
2016-03-29 00:12:52 +00:00
{
/** @var UserRenameEvent[] */
private array $renameEntities = [];
public function __construct(
private readonly EventDispatcherInterface $eventDispatcher,
) {
}
public function getSubscribedEvents(): array
2016-03-29 00:12:52 +00:00
{
return [
'preUpdate',
'postFlush',
];
}
public function preUpdate(PreUpdateEventArgs $event): void
2016-03-29 00:12:52 +00:00
{
/** @var User $entity */
$entity = $event->getObject();
if (!$entity instanceof User) {
return;
}
if ($event->hasChangedField('login')) {
$this->renameEntities[] = new RenameEventEntity($entity, $event->getOldValue('login'));
2016-03-29 00:12:52 +00:00
}
}
/** TODO: try to avoid double flush or no? */
public function postFlush(PostFlushEventArgs $event): void
2016-03-29 00:12:52 +00:00
{
if (0 !== count($this->renameEntities)) {
// Creating event for dispatch
$usersRenamedEvent = new UsersRenamedEvent($this->renameEntities);
$om = $event->getObjectManager();
2016-03-29 00:12:52 +00:00
foreach ($this->renameEntities as $item) {
$om->persist($item);
2016-03-29 00:12:52 +00:00
}
$this->renameEntities = [];
2016-03-29 00:12:52 +00:00
$om->flush();
$this->eventDispatcher->dispatch($usersRenamedEvent, UsersRenamedEvent::NAME);
2016-03-29 00:12:52 +00:00
}
}
}