基于问题和这个答案,我同意事件preUpdate()
与Symfony和Doctrine的结合在一起。
准确地说,我的意思是上面答案中的这一行:
$event->setNewValue('password', $user->getPassword());
为什么我需要手动设置新值的额外步骤?
我认为学说可以处理事件并自行更新实体,而无需呼吁flush
?
支持抛出的例外
Field "password" is not a valid field of the entity "...UserBundleEntityUser" in PreUpdateEventArgs.
当我使用它时,我不明白为什么我需要手动修改实体。
有关例外的扩展信息:仅在用户登录时才会抛出。当用户注册或编辑用户时。
setNewValue()
方法可用于更改已标记为更新的字段的值。如果出于某种原因,您要更新的字段尚未更改。
通常,将密码设置为null足以将其添加到更改中。如果不是,您可以请求工作单位重新计算更改。
例如:
<?php
if ($event->hasChangedField('password')) {
$event->setNewValue('password', $newPassword);
}
else {
$em = $event->getEntityManager();
$uow = $em->getUnitOfWork();
$uow->recomputeSingleEntityChangeSet(
$em->getClassMetadata(User::class),
$entity
);
}