2014-02-05 43 views
0

根据问题和这个answer,我将事件preUpdate()结合symfony和doctrine确实做了什么。Symfony2学说'preUpdate'事件编码密码

确切的说,我的意思是在上面的回答这一行:

$event->setNewValue('password', $user->getPassword());

为什么我需要手动设置的新值额外的步骤?
我认为该原则处理事件并自己更新实体,而无需调用例如flush

扶持抛出的异常
Field "password" is not a valid field of the entity "...\UserBundle\Entity\User" in PreUpdateEventArgs.
时,我用这个,我不明白为什么我需要手动修改的实体。

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

+0

你真的有在'... \ UserBundle \实体\ User'实体'getPassword来()'和'setPassword()''方法财产password'? –

+0

也许你使用这个字段的验证器?那个密码你设定的是无效的?检查这个,请 –

+0

是@Victor我多次检查属性和方法。 ' ... /** * @ORM \柱(类型= “字符串”,长度= 255) */ 保护$密码; ... ' 也没有验证这一点。 – FunkeMT

回答

2

setNewValue()方法可用于更改已标记为更新的字段的值。如果出于任何原因,您想要更新的字段尚未更改,则它不起作用。

通常,将密码设置为空即可将其添加到变更集中。如果不是,您可以请求工作单元重新计算更改。

例如:

<?php 

if ($event->hasChangedField('password')) { 
    $event->setNewValue('password', $newPassword); 
} 
else { 
    $em = $event->getEntityManager(); 
    $uow = $em->getUnitOfWork(); 
    $uow->recomputeSingleEntityChangeSet(
     $em->getClassMetadata(User::class), 
     $entity 
    ); 
}