Php Symfony2学说';预更新';事件对密码进行编码
基于这个问题,我混淆了事件Php Symfony2学说';预更新';事件对密码进行编码,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,基于这个问题,我混淆了事件preUpdate()与symfony和条令的结合到底起到了什么作用 确切地说,我指的是上面答案中的这一行: $event->setNewValue('password',$user->getPassword()) 为什么我需要手动设置新值的额外步骤? 我认为条令可以自行处理事件并更新实体,而无需调用例如flush 支持抛出的异常 字段“password”不是PreUpdateEventArgs中实体“…\UserBundle\entity\User”的有效字段。 当我
preUpdate()
与symfony和条令的结合到底起到了什么作用
确切地说,我指的是上面答案中的这一行:
$event->setNewValue('password',$user->getPassword())代码>
为什么我需要手动设置新值的额外步骤?
我认为条令可以自行处理事件并更新实体,而无需调用例如flush
支持抛出的异常
字段“password”不是PreUpdateEventArgs中实体“…\UserBundle\entity\User”的有效字段。
当我使用它时,我不明白为什么我需要手动修改实体
有关异常的扩展信息:仅当用户登录时才会引发该异常。注册或编辑用户时不需要。可以使用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
);
}
您是否在..\UserBundle\Entity\User
实体中使用getPassword()
和setPassword()
方法确实具有password
属性?可能您对该字段使用了任何验证器?你设置的密码无效吗?检查这个,PleaseEyes@Victor我检查了好几次属性和方法@ORM\Column(type=“string”,length=255)*/protected$password;…`也没有验证程序。直接密码呢?尝试直接传递它,如$event->setNewValue('password','qwerty123')代码>。它有效吗?不,它也无效。但主要的问题是,我为什么需要这个?可能是因为引发了异常,但我仍然不明白为什么需要手动设置该值@胜利者