Symfony 扩展现有实体以覆盖添加和删除功能

Symfony 扩展现有实体以覆盖添加和删除功能,symfony,doctrine-orm,Symfony,Doctrine Orm,我想向第三方bundle实体添加额外的逻辑。在这个实体中有添加和删除功能 是否有方法扩展此实体并覆盖添加和删除功能 这是我的扩展实体。我正在尝试扩展Oro\Bundle\CalendarBundle\Entity\CalendarEvent。运行它时,不会调用扩展实体 如果您想在添加或删除与会者时加入该流程,我认为您需要签出该服务: 以及相关类别: 如果您还有问题,请阅读并更新您的问题。我已经阅读了。我可以覆盖包的所有其他部分,除了实体文件。啊,是的,我认为你不能覆盖条令实体映射。但仅在某些部

我想向第三方bundle实体添加额外的逻辑。在这个实体中有添加和删除功能

是否有方法扩展此实体并覆盖添加和删除功能

这是我的扩展实体。我正在尝试扩展
Oro\Bundle\CalendarBundle\Entity\CalendarEvent
。运行它时,不会调用扩展实体


如果您想在添加或删除与会者时加入该流程,我认为您需要签出该服务:

以及相关类别:


如果您还有问题,请阅读并更新您的问题。我已经阅读了。我可以覆盖包的所有其他部分,除了实体文件。啊,是的,我认为你不能覆盖条令实体映射。但仅在某些部分使用。其他部分直接实例化它,所以我想如果你想“交换”这个类,你需要重写很多部分。您是否只需要在将与会者添加到事件后添加日志条目?我不需要更改映射。无论何时添加或删除与会者,我都需要启动一个功能。谢谢!这就是我要找的。
# OroCalendarBundle/Resources/config/services.yml
services:
    oro_calendar.listener.calendar_event_attendees:
        class: Oro\Bundle\CalendarBundle\EventListener\CalendarEventAttendeesListener
        tags:
            - { name: doctrine.event_listener, event: onFlush }
<?php

namespace Oro\Bundle\CalendarBundle\EventListener;

use Doctrine\ORM\Event\OnFlushEventArgs;
use Doctrine\ORM\UnitOfWork;

use Oro\Bundle\CalendarBundle\Entity\Attendee;
use Oro\Bundle\CalendarBundle\Entity\CalendarEvent;
use Oro\Bundle\PlatformBundle\EventListener\OptionalListenerInterface;

class CalendarEventAttendeesListener implements OptionalListenerInterface
{
    /** @var bool */
    protected $enabled = true;
/**
 * @param OnFlushEventArgs $args
 */
public function onFlush(OnFlushEventArgs $args)
{
    if (!$this->enabled) {
        return;
    }

    $entityManager = $args->getEntityManager();
    $unitOfWork = $entityManager->getUnitOfWork();

    $newEntities = $unitOfWork->getScheduledEntityInsertions();
    $updateEntities = $unitOfWork->getScheduledEntityUpdates();
    $deletedEntities = $unitOfWork->getScheduledEntityDeletions();

    foreach ($newEntities as $entity) {
        if ($this->isAttendeeApplicable($entity, $unitOfWork)) {
            $this->updateCalendarEventUpdatedAt($entity->getCalendarEvent(), $unitOfWork);
        }
    }
    foreach ($updateEntities as $entity) {
        if ($this->isAttendeeApplicable($entity, $unitOfWork)) {
            $this->updateCalendarEventUpdatedAt($entity->getCalendarEvent(), $unitOfWork);
        }
    }
    foreach ($deletedEntities as $entity) {
        if ($this->isAttendeeApplicable($entity, $unitOfWork)
            && !$unitOfWork->isScheduledForDelete($entity->getCalendarEvent())
        ) {
            $this->updateCalendarEventUpdatedAt($entity->getCalendarEvent(), $unitOfWork);
        }
    }
}

/**
 * @param object $entity
 *
 * @return bool
 */
protected function isAttendeeApplicable($entity, UnitOfWork $unitOfWork)
{
    return $entity instanceof Attendee
        && $entity->getCalendarEvent()
        && !$entity->getCalendarEvent()->isUpdatedAtSet()
        && count($unitOfWork->getEntityChangeSet($entity->getCalendarEvent())) == 0;
}

/**
 * @param CalendarEvent $calendarEvent
 * @param UnitOfWork    $unitOfWork
 */
protected function updateCalendarEventUpdatedAt(CalendarEvent $calendarEvent, UnitOfWork $unitOfWork)
{
    $oldUpdatedAt = $calendarEvent->getUpdatedAt();
    $newUpdatedAt = new \DateTime('now', new \DateTimeZone('UTC'));

    $calendarEvent->setUpdatedAt($newUpdatedAt);
    $unitOfWork->propertyChanged($calendarEvent, 'updatedAt', $oldUpdatedAt, $newUpdatedAt);
}

/**
 * {@inheritdoc}
 */
public function setEnabled($enabled = true)
{
    $this->enabled = $enabled;
}