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

2024-03-26

我正在使用 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());

有没有优雅的方法来处理这个用例?


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

请执行下列操作

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

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

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

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

所以,到bindRequest您已经丢失了之前的密码进入物体(显然还没有进入数据库)如果留空。从现在开始的每一个控制都是没有用的。

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

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

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

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

where plainPassword我想是我们感兴趣的领域的名称。

If you find that this field contain a value (else branch) you haven't to do anything.
Otherwise you have to retrieve original password from User Object and set it into $request corrisponding value.
(update) Otherwise you may retrieve password from User Object but since that password is stored with an hased valued, you can't put it into the $request object because it will suffer from hashing again.
What you could do - i suppose - is an array_pop http://php.net/manual/en/function.array-pop.php directly into $request object and put away the field that messes all the things up (plainPassword) Now that you had done those things, you can bind posted data to underlying object.

另一个解决方案(可能更好,因为您将一些业务逻辑从控制器中移开)是使用prePersisthook,但概念上更先进。如果您想探索该解决方案,您可以阅读以下内容表单事件 http://symfony.com/doc/current/cookbook/form/dynamic_form_generation.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用户使用 FOSUserBundle 更新配置文件时忽略密码 的相关文章

随机推荐

  • 角度类型的BehaviorSubject

    假设我有一个模型用户 我想创建一个 User 类型的BehaviorSubject 如下所示 private userSource new BehaviorSubject
  • 在Powershell中,如何等待并行作业完成后再继续?

    基于如何并行执行PowerShell函数多次 https stackoverflow com questions 12766174 how to execute a powershell function several times in
  • Pandas 按 Zscore 过滤每组异常

    我有一个数据框 其中的 组 列可以有 50 个不同的值 还有一个数字 值 列 一个例子可以是 pd DataFrame group a b c a a b a c c value 2 123 4 2 3 2 5 127 128 4 0 00
  • 如何在sparkR中绑定两个数据框列?

    如何在spark 1 4的SparkR中绑定两列dataframe 蒂亚 阿伦 没有办法做到这一点 这是一个关于scala中的spark 1 3 的问题 能够做到这一点的唯一方法是使用某种 row numbering 因为这样您就可以加入
  • Rails 用范围扩展领域,PG 不喜欢它

    我有一个小部件模型 小部件属于 Store 模型 Store 模型属于 Area 模型 Area 模型属于 Company 在公司模型中 我需要找到所有关联的小部件 简单的 class Widget lt ActiveRecord Base
  • 如何子类化 UITextField 并重写 drawPlaceholderInRect 来更改占位符颜色

    我有一个 3UITextField与占位符文本集 在其中之一UITextField我希望占位符文本为红色 现在 在谷歌搜索之后 似乎最好的方法是子类化 UITextField 并覆盖drawPlaceholderInRect 我如何进行子类
  • 在只有一个键的哈希中查找键名?

    如果我有一个哈希 my h secret gt 1 我知道这只是哈希中的一个键 但我不知道它叫什么 然后我是否必须迭代该哈希 my key foreach my i keys h key h i 或者有更好的方法来获取密钥的名称吗 A 列表
  • 如何从另一个分支获取一个文件

    我有一个main带有名为的文件的分支app js 我对此文件进行了更改experiment branch 我只想应用所做的更改app js from experiment到main branch git checkout main firs
  • mov ah、word_variable 上的“无效指令操作数”以及在 16 位数字上使用 imul

    这是我想要实现的目标 a x b x a y b y a z b z 我正在尝试在汇编中创建一个宏来执行上述计算 我在用WORDs 代表我所有的号码 这是我的代码 dotProduct MACRO A X A Y A Z B X B Y B
  • 在沙箱中运行插件

    我正在设计一个 C C 系统 可以使用各种插件进行扩展 有一个定义良好的 C 公共 API 主要适用于 const char 和其他指针类型 插件被编译成 so 或 dll 文件 主应用程序在启动时加载它们 然后根据请求卸载或重新加载它们
  • Java 的单文件、持久、排序键值存储(Berkeley DB 的替代方案)[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Berkeley DB JE 许可可能是交易杀手 我有一个面向一小部分客户的 Java 应用程序 但由
  • 如何使 .NET 反射与动态生成的对象一起工作? [复制]

    这个问题在这里已经有答案了 看下面的例子 void Main APPROACH 1 With an anonymous type var myObject new Property1 PropertyValue1 WORKS Propert
  • 如何防止 EMR Spark 步骤重试?

    我有一个 AWS EMR 集群 emr 4 2 0 Spark 1 5 2 我在其中从 aws cli 提交步骤 我的问题是 如果 Spark 应用程序失败 则 YARN 会尝试再次运行该应用程序 在相同的 EMR 步骤下 我怎样才能防止这
  • PHP 日期转换为 strtotime

    我有一个array其中每条记录都有一个 date 场地 日期的格式如下 10 09 2015 当我使用strtotime在这些日期 其中一些结果是false 我认为数据结构中有错误 所以我创建了这个简单的array和一个简单的foreach
  • C++:cin while cout [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 好吧 我正在用 C 编写一个聊天程序 以便在 Linux 终端中使用 我希望在打字时也能收到消息 基本上 非阻塞cin
  • 开源 C/C++ 数学表达式解析器库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • file_get_contents(): php_network_getaddresses: getaddrinfo 失败

    我正在尝试使用 cron 作业将一些值从一台服务器更新到另一台服务器 我使用 file get contents 奇怪的是 这偶尔会失败 一分钟还可以 一分钟就不行了 我收到这两个错误 PHP 警告 file get contents ph
  • 升级到 ASP.NET MVC 版本 2

    我今天一直在 ASP NET MVC 项目上做一些工作 我尝试发布该网站 但出现错误 我的托管服务提供商告诉我 这是因为我拥有版本 1 而他们支持版本 2 我怎样才能升级到版本2 两个版本之间的差异是否如此巨大以至于后续版本不支持先前版本
  • GoogleUser 对象没有 grantOfflineAccess 方法?

    我在用谷歌登录 https developers google com identity sign in web reference对我网站上的用户进行身份验证 然后作为单独的步骤请求离线权限 根据文档 GoogleUser对象应该有一个方
  • 用户使用 FOSUserBundle 更新配置文件时忽略密码

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