Symfony 2 Получить исходные данные объекта от менеджера объектов

Я использую пакет администрирования Sonata для моего приложения, все работает хорошо, в моем приложении у меня есть пользователи и admin, admin может добавлять/редактировать/удалять пользователей, когда я пытаюсь обновить пользователя, есть проблема с данными пароля переопределяется из таблицы пользователей. я переопределил метод 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());, он получает значение null и обновляет пароль как null, не получая данные редактирования, я попытался снова получить репозиторий (ниже), чтобы получить пароль, но не повезло, что он получил тот же самый

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

Есть ли способ получить доступ к исходным данным текущего объекта в диспетчере сущностей

Ответ 1

Вы можете получить доступ к исходным данным, получив доктрину Единица работы. Как из документов

Вы можете получить прямой доступ к Единице работы, позвонив EntityManager # getUnitOfWork(). Это вернет UnitOfWork экземпляр, который в настоящее время использует EntityManager. Массив, содержащий исходные данные сущности

Возьмите пароль из Единицы работы и используйте в своем методе настройки

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 */
    }
}

Надеюсь, что он отлично работает

Прямой доступ к единице работы

Ответ 2

Сбросить сущность в управлении сущностью, пример для события 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);

            }
        }
    }

Ответ 3

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

Итак, оставьте часть getManager();