Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在使用Symfony 4要求用户输入密码后修改用户信息_Symfony_Symfony4_Symfony5 - Fatal编程技术网

如何在使用Symfony 4要求用户输入密码后修改用户信息

如何在使用Symfony 4要求用户输入密码后修改用户信息,symfony,symfony4,symfony5,Symfony,Symfony4,Symfony5,我想创建一个页面,允许用户修改他的个人信息。 我希望他输入当前密码以修改任何信息 我根据连接的用户创建了一个表单。当表单提交且有效时,我想使用passwordEncoder的函数isPasswordValid()检查密码是否有效 我的问题是,当使用$user作为参数调用此函数时,它总是返回false。我发现这个问题是从哪里来的,这是因为$user作为参数在表单提交时被修改过。我尝试声明另一个变量来存储我的初始用户($dbUser),并使用另一个变量来实例表单,但当我转储 $dbUser它已被修改

我想创建一个页面,允许用户修改他的个人信息。 我希望他输入当前密码以修改任何信息

我根据连接的用户创建了一个表单。当表单提交且有效时,我想使用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条件下,当