Symfony,FOS 用户:使用空输入密码编辑用户
Symfony2, FOSuser : Edit user with empty input password
我正在使用自己的实体扩展 fos_user。
我实际上在 2 个不同的 table 中扩展用户实体(扩展 table 用户的投资者)。用户中存储了一些数据,例如密码和电子邮件。投资者可以访问 Fos_user 方法。
我有一个填充了用户数据的表单。我需要能够在有或没有密码的情况下更新用户。
这是这样做的:
if(!empty($form->get('password')->getData())){
$investor->setPlainPassword($form->get('password')->getData());
}
除非密码输入为空,否则更新工作正常。
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'password' cannot be null
这就是我在表单 $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(),
);
}
如何在不提供新密码或旧密码的情况下更新我的用户?
我终于找到了解决办法:
可以使用 setPassword();
设置 Unhashed/Unsalted 密码
因此,如果密码为空,我将使用之前的散列密码设置密码,这样它就不会再次散列。如果它不为空,我将使用 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(),
);
}
我正在使用自己的实体扩展 fos_user。
我实际上在 2 个不同的 table 中扩展用户实体(扩展 table 用户的投资者)。用户中存储了一些数据,例如密码和电子邮件。投资者可以访问 Fos_user 方法。
我有一个填充了用户数据的表单。我需要能够在有或没有密码的情况下更新用户。
这是这样做的:
if(!empty($form->get('password')->getData())){
$investor->setPlainPassword($form->get('password')->getData());
}
除非密码输入为空,否则更新工作正常。
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'password' cannot be null
这就是我在表单 $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(),
);
}
如何在不提供新密码或旧密码的情况下更新我的用户?
我终于找到了解决办法:
可以使用 setPassword();
设置 Unhashed/Unsalted 密码因此,如果密码为空,我将使用之前的散列密码设置密码,这样它就不会再次散列。如果它不为空,我将使用 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(),
);
}