在非持久字段更改上保留实体

2024-05-14

我有一个具有 plainPassword 和密码属性的实体。在表单中,我映射到 plainPassword。之后,当用户验证表单时,我对 plainPassword 进行密码验证。

为了对密码进行编码,我使用了监听 prePersist 和 preUpdate 的 EventSubscriber。它适用于注册表单,因为它是一个新实体,用户填写一些持久的属性,然后教条将其持久化并刷新。

但是,当我只想编辑密码时,它不起作用,我认为这是因为用户只是编辑了非持久属性。那么教义就不会试图坚持它。但我需要它来输入订阅者。

有人知道该怎么做吗? (我在其他实体中也有类似的问题)目前,我在控制器中进行操作......

多谢。

我的用户订阅者

  class UserSubscriber implements EventSubscriber
  {
      private $passwordEncoder;
      private $tokenGenerator;

      public function __construct(UserPasswordEncoder $passwordEncoder, TokenGenerator $tokenGenerator)
      {
          $this->passwordEncoder = $passwordEncoder;
          $this->tokenGenerator = $tokenGenerator;
      }

      public function getSubscribedEvents()
      {
          return array(
              'prePersist',
              'preUpdate',
          );
      }

      public function prePersist(LifecycleEventArgs $args)
      {
          $object = $args->getObject();
          if ($object instanceof User) {
              $this->createActivationToken($object);
              $this->encodePassword($object);
          }
      }

      public function preUpdate(LifecycleEventArgs $args)
      {
          $object = $args->getObject();
          if ($object instanceof User) {
              $this->encodePassword($object);
          }
      }

      private function createActivationToken(User $user)
      {
          // If it's not a new object, return
          if (null !== $user->getId()) {
              return;
          }

          $token = $this->tokenGenerator->generateToken();
          $user->setConfirmationToken($token);
      }

      private function encodePassword(User $user)
      {
          if (null === $user->getPlainPassword()) {
              return;
          }

          $encodedPassword = $this->passwordEncoder->encodePassword($user, $user->getPlainPassword());
          $user->setPassword($encodedPassword);
      }

我的用户实体:

class User implements AdvancedUserInterface, \Serializable
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @ORM\Column(name="email", type="string", length=255, unique=true)
 * @Assert\NotBlank()
 * @Assert\Email()
 */
private $email;

/**
 * @Assert\Length(max=4096)
 */
private $plainPassword;

/**
 * @ORM\Column(name="password", type="string", length=64)
 */

private $password;

配置文件控制器:

class ProfileController extends Controller 
{
/**
 * @Route("/my-profile/password/edit", name="user_password_edit")
 * @Security("is_granted('IS_AUTHENTICATED_REMEMBERED')")
 */
public function editPasswordAction(Request $request)
{
    $user = $this->getUser();
    $form = $this->createForm(ChangePasswordType::class, $user);
    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        // Encode the password
        // If I decomment it, it's work, but I want to do it autmaticlally, but in the form I just change the plainPassword, that is not persisted in database
        //$password = $this->get('security.password_encoder')->encodePassword($user, $user->getPlainPassword());
        //$user->setPassword($password);
        $em = $this->getDoctrine()->getManager();
        $em->flush();
        $this->addFlash('success', 'Your password have been successfully changed.');
        return $this->redirectToRoute('user_profile');
    }
    return $this->render('user/password/edit.html.twig', [
        'form' => $form->createView(),
    ]);
}

}


您可以通过直接操作 UnitOfWork 来强制 Doctrine 将对象标记为脏对象。

$em->getUnitOfWork()->scheduleForUpdate($entity)

然而,我强烈反对这种方法,因为它违反了精心设计的抽象层。

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

在非持久字段更改上保留实体 的相关文章

随机推荐

  • TCPClient未收到数据

    我想使用 StreamReader 和 StreamWriter 通过 TCPClient NetworkStream 接收和发送数据 代码如下所示 客户端代码 using TcpClient client new TcpClient IP
  • 注销按钮在 mvc 应用程序中不起作用

    我有一个具有不同用户帐户和密码的 MVC 应用程序 登录功能工作正常 但当我单击注销按钮时 出现 404 错误 应用程序中的服务器错误 无法找到该资源 描述 HTTP 404 您正在查找的资源 或其依赖项之一 可能已被删除 名称已更改或暂时
  • 在推送到容器注册表之前如何对构建的映像运行测试?

    从 gitlab 文档中可以看出如何使用 kaniko 创建 docker 镜像 build stage build image name gcr io kaniko project executor debug entrypoint sc
  • 高效地将大型 Pandas 数据帧写入磁盘

    我正在尝试找到使用 Python Pandas 高效地将大型数据帧 250MB 写入磁盘或从磁盘写入的最佳方法 我已经尝试了所有方法Python 数据分析 但表现却非常令人失望 这是一个更大项目的一部分 该项目探索将我们当前的分析 数据管理
  • 如何检测 iOS 8 上的包含应用程序是否启用了应用程序扩展?

    我正在 iOS 8 beta 上开发一个自定义键盘 我想告诉用户如果我的自定义键盘未启用 如何在包含应用程序中启用它 有什么方法可以检测应用程序扩展是否已启用 首先让我们设置一些常量 以便于彼此理解 包含应用程序 安装扩展并保存扩展二进制文
  • 让 WSO2 IOT 服务器作为 Windows 服务运行

    我在Server 2012R2上安装了WSO2 IOT Server 我安装了 YAJSW 包装器并按照 WSO2 说明进行配置 当我启动 runConsole bat 来配置 Windows 服务时 出现以下错误 我设置了 JAVA HO
  • 基于类的通用视图额外的上下文

    在基于类的视图之前 有一个可以在 urlsconf 中传递的 extra context 关键字 https docs djangoproject com en 1 3 topics generic views adding extra c
  • WPF:当 FontStyle 为 Oblique 时,剪切文本块中最后一个字母的部分

    我有一个简单的 XAML 示例
  • 混合混合模式:乘法在 Chrome 中不起作用

    我正在尝试使用mix blend mode multiply在 Chrome 上 但它无法按预期工作 当我添加时magenta cyan and yellow在一起它不会给我黑色但brown https i stack imgur com
  • 从 Bootstrap 4 网格中删除装订线

    在 Bootstrap 4 中 我被要求自定义桌面的默认网格系统 如下所示 其中 容器 桌面断点为1280px 我尝试过的例子是 body margin top 3rem l wrap max width 1280px margin rig
  • 在这种情况下垃圾收集器会做什么? [复制]

    这个问题在这里已经有答案了 我试图了解 GC 将如何行动的两种情况 1 有两个对象 object1 和 object2 object1 引用了 object2 object2 引用了 object1 现在 这两个对象都没有被使用 GC 可以
  • 获取所有矩阵列逐元素乘积对的快速方法

    假设我有一个数字matrix set seed 1 mat lt matrix rnorm 1000 ncol 100 我想生成所有向量 它们是中所有唯一向量对的逐元素乘积的结果mat 我们如何改进下面的代码 all pairs lt t
  • RSA 私有指数确定

    我的问题是关于 RSA 签名 如果是 RSA 签名 加密 gt y x d mod n 解密 gt x y e mod n x gt 原始消息 y gt 加密消息 n gt 模数 1024 位 e gt 公共指数 d gt 私有指数 我知道
  • 查看Java Agent修改的Java类的源代码

    我需要了解 Java 代理如何修改我的初始类 以便我能够理解代码的作用 build gradle configurations jar archiveName agent2 jar jar manifest attributes Prema
  • 如何使用 AWS Glue 开始处理从 Web 服务终端节点提取的数据?

    更多源数据来自我需要定期轮询的 Web 服务端点 获得数据后 我可以使用 pyspark 执行传统的 ETL 并最终将数据写入 S3 和 Redshift 我不确定如何进行初始提取 甚至不确定我应该在 AWS Glue 文档中查找什么内容
  • 对象集合表单的 Freemarker 语法 (Spring 3 MVC)

    我有一个命令 bean FooList 它有一个属性 它是一个集合 aList of Foo beans 我正在尝试创建一个可以编辑所有内容的表单Foo立刻 我发现了许多如何使用 JSP 执行此操作的示例 但我在将这些示例转换为 Freem
  • 我们可以有条件地声明 spring bean 吗?

    有没有一种方法可以有条件地声明 Spring bean 例如
  • Haskell 泛化问题(涉及列表理解)

    假设我想知道a上的所有要点 x y 矩形内的平面has 我可以使用列表推导式来计算 如下所示 let myFun2D x y x lt 0 2 y lt 0 2 现在 如果我想为一个人完成同样的事情 x y z 空间 我可以采取同样的方式并
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • 在非持久字段更改上保留实体

    我有一个具有 plainPassword 和密码属性的实体 在表单中 我映射到 plainPassword 之后 当用户验证表单时 我对 plainPassword 进行密码验证 为了对密码进行编码 我使用了监听 prePersist 和