Symfony2 Doctrine'preUpdate'事件用于编码密码

时间:2014-02-05 13:21:31

标签: php symfony doctrine-orm

基于问题和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.
当我使用它时,我不明白为什么我需要手动修改实体。

有关异常的扩展信息:仅在用户登录时抛出。不是在用户注册或编辑时。

1 个答案:

答案 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
    );
}