Как изменить значение поля в прослушивателе событий preUpdate?
Документация гласит:
Изменения в полях переданных объектов больше не распознаются операцией flush, используйте вычисляемый набор изменений, переданный событию, для изменения значений примитивного поля.
Но он также говорит:
getEntityChangeSet(), чтобы получить копию массива наборов изменений. Изменения этого возвращенного массива не влияют на обновление.
Означает ли это, что я не могу изменять поля объекта в preUpdate eventener? Если нет, то как я могу сделать это обновление?
Ответы
Ответ 1
По-видимому, вам нужно самому перекомпетентно изменить набор изменений, чтобы изменения вступили в силу:
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
$meta = $em->getClassMetadata(get_class($entity));
$uow->recomputeSingleEntityChangeSet($meta, $entity);
Ответ 2
В качестве альтернативы вы можете использовать класс PreUpdateEventArgs (http://www.doctrine-project.org/api/orm/2.2/class-Doctrine.ORM.Event.PreUpdateEventArgs.html). Forexample:
public function preUpdate(PreUpdateEventArgs $args)
{
$entity = $args->getEntity();
if ($entity instanceof Product)
{
$args->setNewValue(
"discount",
123
);
}
}