修改Entity的属性时执行某些操作

时间:2014-02-18 13:55:32

标签: symfony doctrine-orm

上下文

想象一下,我有一个铁路网络:StationRail链接在一起。

  • 我需要对Rails进行定期维护(我有一个Maintenance实体)。
  • Station可以通过将destructionDate属性设置为不同于NULL的内容来销毁实体。
  • 在实体Stations
  • 中定义的2 Rail之间存在“ManyToMany with attributes”关系
  • 我需要跟踪哪个Station已连接/断开连接Station以及何时关联,因此在我的Rail实体中我有一个connectionDate和一个{{1属性。

我想做什么

  • 当我断开2个电台(即disconnectionDate)时,会删除相应的$rail->setDisconnectionDate(now())个实体。
  • 当我销毁一个工作站(即Maintenance)时,相应的$station->setDestructionDate(now())将被断开(即Rail)并删除相应的$rail->setDisconnectionDate($station->getDestructionDate实体。

如何解决

目前,我在控制器的动作中触发事件,它运行正常。但问题是他们在我的应用程序中有很多方法可以断开2个站点或者破坏一个站点而不是所有的母鸡都通过控制器。我需要确保不要错过Station破坏或铁路断开。

所以我在考虑实体中的触发事件,例如在Maintenance方法中。我在网上搜索,显然这不是一个好主意。

我想使用Doctrine postUpdate事件,但即使未修改destroyDate也会触发它们。我可以过滤它,但我不确定这是最好的事情。

那么,你将如何解决这个问题?在这种情况下,最佳做法是什么?

1 个答案:

答案 0 :(得分:2)

您可以创建EventSubscriber并收听preUpdate或onFlush事件。 在preUpdate中,您可以访问已更改的内容。

例如:

class YourEventListener implements EventSubscriber {

    public function getSubscribedEvents()
    {
        return array(
            Events::preUpdate => 'preUpdate'
        );
    }

    public function preUpdate(PreUpdateEventArgs $eventArgs){
        $entity = $eventArgs->getEntity();
        $em = $eventArgs->getEntityManager();

        if($entity instanceof Rail){
            if($eventArgs->hasChangedField('disconnectionDate')){
                //do something
            }
        }
    }
}