Symfony2 prePersist在持久化实体时不会被解雇

时间:2013-01-09 19:14:44

标签: symfony orm annotations doctrine symfony-2.1

我遵循了本教程: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。

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

  

然而prePersist没有被解雇......上传功能

因为你在upload()方法上使用 PostPersist()而不是 PrePersist()

而没有被解雇

PostPersist在保存后被解雇,而PrePersist在保存之前被解雇! 所以你会在保存之后看到“死”,而不是之前。

此外,使用PrePersist时,您的实体尚未拥有ID,而使用PostPersist时,它将分配一个ID。

答案 2 :(得分:0)

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