如何在使用Symfony 4要求用户输入密码后修改用户信息
我想创建一个页面,允许用户修改他的个人信息。 我希望他输入当前密码以修改任何信息 我根据连接的用户创建了一个表单。当表单提交且有效时,我想使用passwordEncoder的函数isPasswordValid()检查密码是否有效 我的问题是,当使用$user作为参数调用此函数时,它总是返回false。我发现这个问题是从哪里来的,这是因为$user作为参数在表单提交时被修改过。我尝试声明另一个变量来存储我的初始用户($dbUser),并使用另一个变量来实例表单,但当我转储 $dbUser它已被修改,我不知道为什么 提交后不应更改变量,因为它从未使用过。。。我找不到我做错了什么如何在使用Symfony 4要求用户输入密码后修改用户信息,symfony,symfony4,symfony5,Symfony,Symfony4,Symfony5,我想创建一个页面,允许用户修改他的个人信息。 我希望他输入当前密码以修改任何信息 我根据连接的用户创建了一个表单。当表单提交且有效时,我想使用passwordEncoder的函数isPasswordValid()检查密码是否有效 我的问题是,当使用$user作为参数调用此函数时,它总是返回false。我发现这个问题是从哪里来的,这是因为$user作为参数在表单提交时被修改过。我尝试声明另一个变量来存储我的初始用户($dbUser),并使用另一个变量来实例表单,但当我转储 $dbUser它已被修改
/**
* @Route("/mes-infos", name="account_infos")
*/
public function showMyInfos(Request $request, UserRepository $userRepo)
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$user = $this->getUser();
// $dbUser = $userRepo->findOneBy(['id' => 13]);
$form = $this->createForm(UserModificationType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$enteredPassword = $request->request->get('user_modification')['plainPassword'];
$passwordEncoder = $this->passwordEncoder;
$manager = $this->getDoctrine()->getManager();
if ($passwordEncoder->isPasswordValid($user, $enteredPassword)) {
dd('it works!!!!!');
// $manager->persist($user);
// $manager->flush();
} else {
dd('It\'s not!!!!');
}
}
return $this->render('account/myaccount-infos.html.twig', [
'form' => $form->createView(),
]);
}
更好的解决方案是使用约束 Symfony已经实现了一个 您可以直接将其添加到实体中。小心申报。如果您不这样做,您的用例“用户更新”将正常工作,但用例“用户创建”现在将失败
namespace-App\Entity;
使用Symfony\Component\Security\Core\Validator\Constraints作为SecurityAssert;
类用户
{
//...
/**
*@SecurityAssert\UserPassword(
*message=“当前密码的值错误”,
*组={“更新”}
* )
*/
受保护的$密码;
//...
}
在表单中,通过更新(或添加)configureOptions方法指定:
//App\Form\UserModificationType
//...
类UserModificationType{
//...
公共函数配置选项(选项解析器$resolver)
{
$resolver->setDefaults([
// ...
“验证组”=>[“更新”],
]);
}
}
然后,$form->isValid()将自动测试密码。因此,您可以删除“if条件”中的所有行
/**
*@Route(“/mes infos”,name=“account\u infos”)
*/
公共函数showMyInfos(请求$Request,用户存储库$userRepo)
{
$this->denyaccessunlessgrated('IS_AUTHENTICATED_FULLY');
$user=$this->getUser();
$form=$this->createForm(UserModificationType::class,$user);
$form->handleRequest($request);
如果($form->isSubmitted()&&&$form->isValid()){
dd('密码很好!它可以工作!!!');
}
返回$this->render('account/myaccount infos.html.twig'[
'form'=>$form->createView()
]);
}
但是我认为在更新用户实体时使用类似的模型是一种更好的做法 更好的解决方案是使用约束 Symfony已经实现了一个 您可以直接将其添加到实体中。小心申报。如果您不这样做,您的用例“用户更新”将正常工作,但用例“用户创建”现在将失败
namespace-App\Entity;
使用Symfony\Component\Security\Core\Validator\Constraints作为SecurityAssert;
类用户
{
//...
/**
*@SecurityAssert\UserPassword(
*message=“当前密码的值错误”,
*组={“更新”}
* )
*/
受保护的$密码;
//...
}
在表单中,通过更新(或添加)configureOptions方法指定:
//App\Form\UserModificationType
//...
类UserModificationType{
//...
公共函数配置选项(选项解析器$resolver)
{
$resolver->setDefaults([
// ...
“验证组”=>[“更新”],
]);
}
}
然后,$form->isValid()将自动测试密码。因此,您可以删除“if条件”中的所有行
/**
*@Route(“/mes infos”,name=“account\u infos”)
*/
公共函数showMyInfos(请求$Request,用户存储库$userRepo)
{
$this->denyaccessunlessgrated('IS_AUTHENTICATED_FULLY');
$user=$this->getUser();
$form=$this->createForm(UserModificationType::class,$user);
$form->handleRequest($request);
如果($form->isSubmitted()&&&$form->isValid()){
dd('密码很好!它可以工作!!!');
}
返回$this->render('account/myaccount infos.html.twig'[
'form'=>$form->createView()
]);
}
但是我认为在更新用户实体时使用类似的模型是一种更好的做法 但是当我转储$dbUser时,它被修改了,我不知道为什么。可能是因为教义引用了同一个对象。当Symfony处理HTTP请求时,它会以某种方式从数据库中获取用户数据,可能是使用Doctrine-todo,与您获取数据的方式类似。Doctrine足够聪明,可以将两个变量引用到同一个PHP“对象”。您能否更具体地说明为什么
isPasswordValid
在User
password属性更改后失败?我希望它能工作,否则你会用旧密码检查一个新密码和一个未更改的实体用户,这对我来说没有意义。否则,当您单独验证数据时,您可以使用更改登录用户和更新实体的所有操作…感谢您对Doctrine如何操作的解释,因为我没有发现如何更改我的变量。当我谈到“$dbUser已被修改”时,我想解释一下,我引用了一个新的独立变量,比如=>$dbUser=$this->getUser(),或者使用一个repo请求。接下来,我使用一个$user,再次存储该用户变量来创建我的表单等。我专门使用这个变量来创建表单等……但是在我的if->isSubmitted条件下,当