我想创建一个页面,允许用户修改他的个人信息。我希望他输入当前密码来修改任何信息。
我在提交表单时基于所连接的用户创建了一个表单,并且该表单有效,我想使用我的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()
]);
}
更好的解决方案是使用约束。
您可以将其直接添加到您的实体中。请小心声明a group for this constraint,否则您的用户创建现在将失败
namespace App\Entity;
use Symfony\Component\Security\Core\Validator\Constraints as SecurityAssert;
class User
{
//...
/**
* @SecurityAssert\UserPassword(
* message = "Wrong value for your current password",
* groups = {"update"}
* )
*/
protected $password;
//...
}
但是我认为在更新用户实体时使用in the documentation这样的模型是一种较好的做法。