基于问题和answer,我认为事件preUpdate()
与symfony和doctrine的结合确实是什么。
确切地说,我的意思是上面答案中的这一行:
$event->setNewValue('password', $user->getPassword());
为什么我需要手动设置新值的额外步骤?
我认为该学说处理事件并自行更新实体而无需调用例如flush
?
支持抛出异常
Field "password" is not a valid field of the entity "...\UserBundle\Entity\User" in PreUpdateEventArgs.
当我使用它时,我不明白为什么我需要手动修改实体。
有关异常的扩展信息:仅在用户登录时抛出。不是在用户注册或编辑时。
答案 0 :(得分:2)
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
);
}