11

我正在为我的应用程序使用 Sonata 管理包,一切正常,在我的应用程序中,我有用户和管理员,当我尝试更新用户时,管理员可以添加/编辑/删除用户存在密码数据被用户覆盖的问题桌子。我已经覆盖了preUpdate管理控制器的方法,我得到了$object一个用户实体管理器的实例,所以如果用户离开以更新密码并保存数据,密码就会丢失。

public function preUpdate($object)
{
    $Password = $object->getUserPassword();
    if (!empty($Password)) { /* i check here if user has enter password then update it goes well*/
        $salt = md5(time());
        $encoderservice = $this->getConfigurationPool()->getContainer()->get('security.encoder_factory');
        $User = new User();
        $encoder = $encoderservice->getEncoder($User);
        $encoded_pass = $encoder->encodePassword($Password, $salt);
        $object->setUserSalt($salt)->setUserPassword($encoded_pass);
    } else { /* here i try to set the old password if user not enters the new password but fails */
        $object->setUserPassword($object->getUserPassword());
    }
}

当我尝试将其设置$object->setUserPassword($object->getUserPassword());为空并将密码更新为空时,它没有获取编辑数据我试图再次获取存储库(如下)以获取密码,但没有运气它得到相同

$DM = $this->getConfigurationPool()->getContainer()->get('Doctrine')->getManager()->getRepository("...")->find(id here);

有没有办法可以访问实体管理器中当前实体的原始数据

4

3 回答 3

31

您可以通过从 docs获取教义的Unit of Work .As来访问原始数据

您可以通过调用 EntityManager#getUnitOfWork() 直接访问工作单元。这将返回 EntityManager 当前使用的 UnitOfWork 实例。包含实体原始数据的数组

从工作单元获取密码并在您的设置方法中使用

public function preUpdate($object)
{

    $DM = $this->getConfigurationPool()->getContainer()->get('Doctrine')->getManager();
    $uow = $DM->getUnitOfWork();
    $OriginalEntityData = $uow->getOriginalEntityData( $object );
    $Password = $object->getUserPassword();
    if (!empty($Password)) { /* i check here if user has enter password then update it goes well*/
        $salt = md5(time());
        $encoderservice = $this->getConfigurationPool()->getContainer()->get('security.encoder_factory');
        $User = new User();
        $encoder = $encoderservice->getEncoder($User);
        $encoded_pass = $encoder->encodePassword($Password, $salt);
        $object->setUserSalt($salt)->setUserPassword($encoded_pass);
    } else { /* here i try to set the old password if user not enters the new password but fails */
        $object->setUserPassword($OriginalEntityData['Password']);/* your property name for password field */
    }
}

希望它工作正常

直接访问工作单元

于 2013-11-27T20:03:18.257 回答
0

在实体管理中重置实体,例如onFlush事件

  /**
     * @param OnFlushEventArgs $args
     *
     * @throws \Doctrine\ORM\ORMException
     * @throws \Doctrine\ORM\OptimisticLockException
     */
    public function onFlush(OnFlushEventArgs  $args)
    {
        $em = $args->getEntityManager();
        $uow = $em->getUnitOfWork();

        foreach ($uow->getScheduledEntityUpdates() as $keyEntity => $entity) {
            if ($entity instanceof Bill) {
                $em->refresh($entity);
                $this->createPdfs($entity);

            }
        }
    }
于 2019-04-19T07:33:44.420 回答
-3
$this->getConfigurationPool()
     ->getContainer()
     ->get('Doctrine')
     ->getRepository("...")
     ->find(id here);

所以省略getManager()部分;

于 2014-04-04T13:28:36.610 回答