【问题标题】:How can I disable the Gedmo/Loggable event on Address如何禁用地址上的 Gedmo/Loggable 事件
【发布时间】:2022-10-17 22:09:31
【问题描述】:

我正在使用 Sylius,我想禁用由 gedmo/loggable 完成的地址更改日志。

这是在 AddressingBundle 的 Address.orm.xml 中添加的:

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

我们没有使用它,并且表格条目很快就会变得疯狂。 (半年超过一百万)

有什么方法可以删除注释或事件?我试图在 LoadClassMetadataEventArgs 上创建一个侦听器以将其从学说元数据中删除,但它不在这里。

PS:有关信息,我使用的是 sylius 1.10.13 和 Gedmo 3.2.0。

编辑: 我找到了一种删除 eventListener 的方法,但我不喜欢该解决方案,因为它禁用了 Gedmo 的所有可能记录,而不仅仅是 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);
            }
        }
    }

【问题讨论】:

  • 请提供足够的代码,以便其他人可以更好地理解或重现该问题。

标签: php symfony sylius


【解决方案1】:

对于仅在地址实体上删除 gedmo/loggable,您可以使用 $eventArgs-&gt;getClassMetadata()-&gt;getName() 确保确实在 SyliusComponentAddressingModelAddress::class 上删除可记录侦听器。

在您的情况下,结果将是:

<?php

declare(strict_types=1);

namespace AppShopEventListener;

use DoctrineORMEventLoadClassMetadataEventArgs;
use DoctrineORMEvents;
use GedmoLoggableLoggableListener;
use SyliusComponentAddressingModelAddress;

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

【讨论】:

    猜你喜欢
    • 2017-11-09
    • 2013-04-20
    • 2015-01-21
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2015-11-08
    • 2013-01-03
    相关资源
    最近更新 更多