2017-05-29 67 views
0

我想向第三方捆绑实体添加其他逻辑。在这个实体中有添加和删除功能。扩展现有实体以覆盖添加和删除功能

有没有办法扩展这个实体并覆盖add和remove函数?

这是我的扩展实体。我尝试延长Oro\Bundle\CalendarBundle\Entity\CalendarEvent。当我运行它时,我的扩展实体不被调用。

<?php 
 

 
namespace CampusCRM\CampusCalendarBundle\Entity; 
 

 
use Oro\Bundle\CalendarBundle\Entity\CalendarEvent as BaseEntity; 
 
use Oro\Bundle\CalendarBundle\Entity\Attendee; 
 

 
class CalendarEvent extends BaseEntity 
 
{ 
 
    /** 
 
    * CalendarEvent constructor. 
 
    */ 
 
    public function __construct() 
 
    { 
 
     parent::__construct(); 
 
    } 
 

 
     /** 
 
    * Add attendee of Calendar Event. This method should not be called using child event. 
 
    * 
 
    * @param Attendee $attendee 
 
    * @return CalendarEvent 
 
    * @throws \LogicException If method is called with child event. 
 
    */ 
 
    public function addAttendee(Attendee $attendee) 
 
    { 
 
     parent::addAttendee($attendee); 
 

 
     file_put_contents('/tmp/freq.log', 'add attendee ' . PHP_EOL, FILE_APPEND); 
 
     
 
     return $this; 
 
    } 
 
}

+0

如果您仍有问题,请阅读http://symfony.com/doc/current/bundles/inheritance.html并更新您的问题。 – lordrhodos

+0

我已阅读它。我可以覆盖该包的所有其他部分,但实体文件除外。 –

+0

啊,是的,我认为你不能重写教条实体映射。 [class被定义为一个参数](https://github.com/orocrm/OroCalendarBundle/blob/master/Resources/config/services.yml#L3),但仅用于某些部分。其他部分直接实例化它,所以我想如果你想“交换”这个类,你需要覆盖很多部分。 您是否需要在与会者加入活动后添加日志条目? – lordrhodos

回答

1

如果要挂钩到过程时,与会者被添加或删除,我想你需要检查出oro_calendar.listener.calendar_event_attendees服务:

# 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 } 

和相关CalendarEventAttendeesListener等级:

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

}

要么覆盖onFlush方法,要么使用类似的方法创建自己的EventListener,以在过程中激发您的函数。

+0

谢谢!这是我正在寻找的。 –