Я использую свою собственную сущность, которая расширяет fos_user.
Я расширяю объект User фактически в 2 разных таблицах (инвестор, который расширяет пользователя таблицы). Некоторые данные, такие как пароль и электронная почта, хранятся у пользователя. Инвестор может получить доступ к этим методам Fos_user.
У меня есть форма, заполненная данными пользователей. Мне нужно обновить пользователя с помощью пароля или без него.
Вот как это делается:
if(!empty($form->get('password')->getData())){
$investor->setPlainPassword($form->get('password')->getData());
}
Обновление отлично работает, за исключением случаев, когда ввод пароля пуст.
SQLSTATE [23000]: Нарушение ограничения целостности: 1048 Колонка "пароль" не может быть нулевой
Вот как я объявляю ввод в моей форме $ builder:
->add('password', 'repeated',
array(
'type' => 'password',
'invalid_message' => 'The password fields have to be the same',
'required' => false,
'first_options' => array('label' => 'New password'),
'second_options' => array('label' => 'Confirm the new password')
)
)
И это мой контроллер:
public function updateInvestorAction(Request $request)
{
$user = $this->container->get('security.context')->getToken()->getUser();
$investor = $this->getDoctrine()->getRepository('AppBundle:Investor')->findOneBy(array('id' => $user->getId()));
$form = $this->createForm(new UpdateInvestorType(), $investor);
$form->handleRequest($request);
if ($form->isValid()) {
if(!empty($form->get('password')->getData())){
$investor->setPlainPassword($form->get('password')->getData());
}
$em = $this->getDoctrine()->getManager();
$em->persist($investor);
$em->flush();
$session = $this->getRequest()->getSession();
$session->getFlashBag()->add('message', 'Votre profil a été correctement modifié');
return $this->redirect($this->generateUrl('home'));
}
return array(
'form' => $form->createView(),
);
}
Как я могу обновить своего пользователя, не указав новый или предыдущий пароль?
Наконец я нашел решение:
Можно установить Unhashed/Unsalted пароль с помощью setPassword();
Поэтому, если пароль пуст, я установлю пароль с предыдущим хешированным паролем, чтобы он снова не был хэширован. Если он не пуст, я буду использовать метод setPlainPassword().
Здесь новый контроллер:
public function updateInvestorAction(Request $request)
{
$user = $this->container->get('security.context')->getToken()->getUser();
$investor = $this->getDoctrine()->getRepository('AppBundle:Investor')->findOneBy(array('id' => $user->getId()));
$password = $investor->getPassword();
$form = $this->createForm(new UpdateInvestorType(), $investor);
$form->handleRequest($request);
if ($form->isValid()) {
if(!empty($form->get('password')->getData())){
$investor->setPlainPassword($form->get('password')->getData());
}
else{
$investor->setPassword($password);
}
$em = $this->getDoctrine()->getManager();
$em->persist($investor);
$em->flush();
$session = $this->getRequest()->getSession();
$session->getFlashBag()->add('message', 'Votre profil a été correctement modifié');
return $this->redirect($this->generateUrl('home'));
}
return array(
'form' => $form->createView(),
);
}