2013-11-27 2 views
8

Я использую пакет администрирования Sonata для моего приложения, все работает хорошо, в моем приложении у меня есть пользователи и admin, admin может добавлять/редактировать/удалять пользователей, когда я пытаюсь обновить у пользователя возникает проблема, когда данные пароля переопределяются из таблицы пользователей. я переопределил метод администратора admin preUpdate, я получил $object, у которого есть экземпляр менеджера сущности пользователя, поэтому, если пользователь уходит, чтобы обновить пароль и сохранить данные, пароль будет потерян.Symfony 2 Получить исходные данные сущности из диспетчера объектов

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

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

ответ

21

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

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

захватить пароль от единицы работы и использовать в методе сеттера

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

Надеется, что это работает отлично

Direct access to a Unit of Work

+0

Я попробую это –

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

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

+1

Неправильное. Это даст вам обновленный объект. – Simon

 Смежные вопросы

  • Нет связанных вопросов^_^