我有一个实体 Order
,其属性 events
应该包含对该实体所做的所有更改的列表 .
Order
班:
<?php
/**
* @ORM\Entity
*/
class Order
{
// more stuff...
/**
* @ORM\OneToMany(
* targetEntity="OrderEvent",
* mappedBy="order",
* cascade={"persist", "merge"}
* )
*/
protected $events;
// more stuff...
}
OrderEvent
班:
/**
* @ORM\Entity
*/
class OrderEvent
{
// more stuff...
/**
* @ORM\ManyToOne(targetEntity="Order", inversedBy="events")
* @ORM\JoinColumn(nullable=false)
*/
protected $order;
// more stuff...
}
class OrderLifecycle
{
public function preUpdate(Order $order, PreUpdateEventArgs $args)
{
$changes = $args->getEntityChangeSet();
if (!empty($changes)) {
$event = new OrderEvent();
$event->setOrder($order)
->setChanges($changes);
$order->addEvent($event);
return $event;
}
}
}
但是according to the doctrine documentation, preUpdate
方法不应该用于更改关联 .
做这样的事情的推荐方法是什么?
我正在使用Zend Framework 2,但我认为这不相关 .
1 回答
我想在这种情况下你可以使用
PostUpdate
事件 . 在这种情况下,您确信update
动作是成功的,您可以做您想做的事情;将新的OrderEvent
实例添加到$events
集合中 .编辑
你不是第一个实现这种事情的人 . 也许你应该查看现有的例子,看看他们如何处理这个问题(甚至考虑使用它) . 例如the Gedmo Loggable solution .
使用此扩展,您可以使用简单的
@annotiation
将实体标记为可记录: