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);
}
}
}
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);
}
}
}
}