Search code examples
phpsymfonysylius

How can I disable the Gedmo/Loggable event on Address


I'm using Sylius and I want to disable the log of address change witch is done by gedmo/loggable.

This is added in the Address.orm.xml from the AddressingBundle here :

<gedmo:loggable log-entry-class="Sylius\Component\Addressing\Model\AddressLogEntry"/>

We have no use of it and the table entries go wild pretty quickly. (More than a million in half a year)

Is there any way to remove the annotation or the event ? I've tried to create a listener on LoadClassMetadataEventArgs to remove it from the doctrine metadata but it's not here.

PS: For information, I'm using sylius 1.10.13 and Gedmo 3.2.0.

EDIT: I found a way to remove the eventListener but I don't like the solution since it disable all the possible loggable from Gedmo and not only for the Address :

    public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs): void
    {
        foreach ($eventArgs->getEntityManager()->getEventManager()->getListeners("postPersist") as $listener) {
            if (get_class($listener) === LoggableListener::class) {
                $eventArgs->getEntityManager()->getEventManager()->removeEventListener(['postPersist, onFlush'], $listener);
            }
        }
    }

Solution

  • For remove gedmo/loggable only on address entity, you can use $eventArgs->getClassMetadata()->getName() to ensure is really on Sylius\Component\Addressing\Model\Address::class to remove loggable listener.

    In your case the result will be :

    <?php
    
    declare(strict_types=1);
    
    namespace App\Shop\EventListener;
    
    use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
    use Doctrine\ORM\Events;
    use Gedmo\Loggable\LoggableListener;
    use Sylius\Component\Addressing\Model\Address;
    
    final class LoadClassMetadataListener
    {
        private const LISTENER_TO_REMOVE = [
            LoggableListener::class => [
                Address::class,
            ],
        ];
    
        public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs): void
        {
            $eventManager = $eventArgs->getEntityManager()->getEventManager();
    
            foreach ($eventManager->getListeners(Events::postPersist) as $listener) {
                if (
                    get_class($listener) === LoggableListener::class
                    && in_array($eventArgs->getClassMetadata()->getName(), self::LISTENER_TO_REMOVE[LoggableListener::class])
                ) {
                    $eventManager->removeEventListener(Events::postPersist, $listener);
                }
            }
    
            foreach ($eventManager->getListeners(Events::onFlush) as $listener) {
                if (
                    get_class($listener) === LoggableListener::class
                    && in_array($eventArgs->getClassMetadata()->getName(), self::LISTENER_TO_REMOVE[LoggableListener::class])
                ) {
                    $eventManager->removeEventListener(Events::onFlush, $listener);
                }
            }
        }
    }