gpt4 book ai didi

symfony - 用户使用 FOSUserBundle 更新配置文件时忽略密码

转载 作者:行者123 更新时间:2023-12-02 11:13:37 25 4
gpt4 key购买 nike

我正在使用 FOSUserBundle,并且正在尝试创建一个允许用户更新其用户个人资料的页面。我面临的问题是,如果用户不想更改/更新密码,我的表单不要求用户重新输入密码。因此,当用户使用空密码提交表单时,数据库将更新为空字符串,并且用户将无法登录。

如果未设置密码字段,如何让我的表单忽略更新密码字段?下面是我正在使用的代码。

$user = $this->get('security.context')->getToken()->getUser();

//user form has email and repeating password fields
$userForm = $this->createForm(new UserFormType(), $user);

if ($request->getMethod() == 'POST') {
$userForm->bindRequest($request);

if($userForm->isValid()){
//this will be be empty string in the database if the user does not enter a password
$user->setPlainPassword($userForm->getData()->getPassword());
$em->flush();
}
}

我尝试了如下一些操作,但这仍然是空的,因为bindRequest为用户设置了空密码

if($userForm->getData()->getPassword())
$user->setPlainPassword($userForm->getData()->getPassword());

我也尝试过,但这会导致类似的情况并导致不需要的查询

if($userForm->getData()->getPassword())
$user->setPlainPassword($userForm->getData()->getPassword());
else
$user->setPlainPassword($user->getPlainPassword());

有什么优雅的方法来处理这个用例吗?

最佳答案

问题在于您在控制密码之前将表单绑定(bind)到用户对象。让我们分析一下您的代码片段。

执行以下操作

$user = $this->get('security.context')->getToken()->getUser();

会将现有用户加载到用户对象中。
现在您使用该数据“构建”一个表单,如果收到帖子,您会将发布的数据放入之前的对象中

$userForm = $this->createForm(new UserFormType(), $user);

if ($request->getMethod() == 'POST') {
$userForm->bindRequest($request);

因此,在 bindRequest 上,如果该密码留空,您就已经丢失对象的先前密码(显然还没有进入数据库)。从现在开始的每一个控制都是无用的。

这种情况下的解决方案是在将表单字段的值绑定(bind)到底层对象之前,直接将表单字段的值手动验证到 $request 对象中。
您可以使用这个简单的代码片段来完成此操作

$postedValues = $request->request->get('formName');

现在您必须验证密码值是否已填写

if($postedValues['plainPassword']) { ... }

其中 plainPassword 我想是我们感兴趣的字段的名称。

如果您发现该字段包含值(else 分支),您无需执行任何操作。
否则,您必须从用户对象中检索原始密码并将其设置为 $request 相应的值。
(更新)否则,您可以从用户对象检索密码,但由于该密码是使用哈希值存储的,因此您无法将其放入 $request 对象中,因为它会再次遭受哈希之苦。
我想你能做的是 array_pop直接进入 $request 对象并收起那些搞乱所有事情的字段(plainPassword)现在您已经完成了这些操作,您可以将发布的数据绑定(bind)到底层对象。

另一个解决方案(可能更好,因为您将一些业务逻辑从 Controller 中移开)是使用 prePersist Hook ,但在概念上更先进。如果您想探索该解决方案,您可以阅读有关 form events 的内容。

关于symfony - 用户使用 FOSUserBundle 更新配置文件时忽略密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11549951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com