【问题标题】:Symfony2 prePersist not fired when persisting entity持久化实体时未触发 Symfony2 prePersist
【发布时间】:2016-08-25 10:10:11
【问题描述】:

我遵循了这个教程:http://symfony.com/doc/current/cookbook/doctrine/file_uploads.html#using-lifecycle-callbacks

但是 prePersist 没有被触发(但是实体被持久化到数据库中)。

   $media = new Media();
   $form = $this->createFormBuilder($media)
            ->add('file')
            ->getForm();

        if ($request->isMethod("POST")) {
            $form->bindRequest($request);

            if ($form->isValid()) {
                $em = $this->getDoctrine()->getManager();

                $em->persist($media);
                $em->flush();
            }
    }

实体: http://dpaste.com/869771/(我刚刚复制并粘贴到课堂上的一些代码)

我加了

die("test");

上传函数,但它没有被调用。那么怎么了?有任何想法吗?我正在使用 sf 2.1。

【问题讨论】:

  • 那么再解释一下数据库映射发生在哪里?如果映射是在 xml 文件中完成的,那么注释对您没有任何好处。不能混搭。需要将生命周期映射添加到您的 xml 文件中。
  • 您的 dpaste 代码已过期,切断了您的问题的用处。请不要使用外部链接,并在问题中包含代码:)

标签: symfony orm annotations doctrine symfony-2.1


【解决方案1】:

假设您在 pastebin 中粘贴的代码是准确的,那么问题是您试图混合使用 xml 映射和注释映射。您需要使用一种或另一种方法。

此链接:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html

显示如何将生命周期映射添加到 xml 文件。

【讨论】:

  • 谢谢,我将它添加到我的 xml 中,不,它工作得很好!! :)
【解决方案2】:

但是 prePersist 没有被触发...到上传功能

它没有被触发,因为您在 upload() 方法上使用了 PostPersist() 而不是 PrePersist()

PostPersist 在保存后触发,而 PrePersist 在保存前触发! 所以你会在保存之后而不是之前看到“死亡”。

此外,当使用 PrePersist 时,您的实体还没有 id,而使用 PostPersist 时,它会分配一个 id。

【讨论】:

【解决方案3】:

我不确定,但我认为因为您的 Media 实体没有任何映射字段,所以会忽略事件。
例如,尝试映射 name 字段以查看它是否有效。
另外,请阅读Tracking Policies

【讨论】:

  • 映射是什么意思?实体是使用 xml 文件中的学说生成的
  • 您的表单是否有除file以外的更多字段?
  • 所以尝试为name 字段添加一个表单字段(带有一些值)。我知道如果实体没有改变,Update 事件不会触发,所以我想在这里检查一下是否是这种情况。
  • 试过了,没区别。仍然 die("test") 没有被调用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多