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