Выяснение того, что изменилось через прослушиватель postUpdate в Symfony 2.1
У меня есть прослушиватель postUpdate, и я хотел бы знать, какие значения были до обновления и какие значения для записи DB были после обновления. Есть ли способ сделать это в Symfony 2.1? Я посмотрел, что хранится в getUnitOfWork (), но он пуст, так как обновление уже произошло.
4 ответов
нашел решение здесь. То, что мне было нужно, на самом деле было частью preUpdate(). Мне нужно было вызвать getEntityChangeSet () на LifecycleEventArgs.
мой код:
public function preUpdate(Event\LifecycleEventArgs $eventArgs)
{
$changeArray = $eventArgs->getEntityChangeSet();
//do stuff with the change array
}
вы можете использовать этот ответ Symfony2-доктрина - нет набора изменений в post update
/**
* @param LifecycleEventArgs $args
*/
public function postUpdate(LifecycleEventArgs $args)
{
$changeArray = $args->getEntityManager()->getUnitOfWork()->getEntityChangeSet($args->getObject());
}
Ваш Entitiy:
/**
* Order
*
* @ORM\Table(name="order")
* @ORM\Entity()
* @ORM\EntityListeners(
* {"\EventListeners\OrderListener"}
* )
*/
class Order
{
...
ваш слушатель:
class OrderListener
{
protected $needsFlush = false;
protected $fields = false;
public function preUpdate($entity, LifecycleEventArgs $eventArgs)
{
if (!$this->isCorrectObject($entity)) {
return null;
}
return $this->setFields($entity, $eventArgs);
}
public function postUpdate($entity, LifecycleEventArgs $eventArgs)
{
if (!$this->isCorrectObject($entity)) {
return null;
}
foreach ($this->fields as $field => $detail) {
echo $field. ' was ' . $detail[0]
. ' and is now ' . $detail[1];
//this is where you would save something
}
$eventArgs->getEntityManager()->flush();
return true;
}
public function setFields($entity, LifecycleEventArgs $eventArgs)
{
$this->fields = array_diff_key(
$eventArgs->getEntityChangeSet(),
[ 'modified'=>0 ]
);
return true;
}
public function isCorrectObject($entity)
{
return $entity instanceof Order;
}
}
вы можете найти пример в доктрине документации.
class NeverAliceOnlyBobListener
{
public function preUpdate(PreUpdateEventArgs $eventArgs)
{
if ($eventArgs->getEntity() instanceof User) {
if ($eventArgs->hasChangedField('name') && $eventArgs->getNewValue('name') == 'Alice') {
$eventArgs->setNewValue('name', 'Bob');
}
}
}
}