【问题标题】:Symfony2 Doctrine 'preUpdate' event to encode passwordSymfony2 Doctrine 'preUpdate' 事件来编码密码
【发布时间】:2014-02-05 13:21:30
【问题描述】:

基于问题和这个answer,我对事件preUpdate() 结合symfony 和教义的真正作用感到困惑。

确切地说,我的意思是上面答案中的这一行:

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

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

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

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

【问题讨论】:

  • 你在...\UserBundle\Entity\User实体中真的有password属性吗?getPassword()setPassword()方法?
  • 也许您对该字段使用了任何验证器?您设置的密码无效?请检查一下
  • 是的@Victor 我检查了几次属性和方法。 ` ... /** * @ORM\Column(type="string", length=255) */ protected $password; ... ` 也没有验证器。
  • 直接密码呢?尝试像$event->setNewValue('password', 'qwerty123'); 一样直接传递它。有用吗?
  • 不,它也不起作用。但主要的问题是,为什么我仍然需要这个?可能是因为this 引发了异常,但我仍然不明白为什么我需要手动设置该值。 @维克多

标签: php symfony doctrine-orm


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 2013-09-10
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多