Symfony2:PrePersist/PreUpdate 生命周期事件未触发

2024-05-24

两个实体画廊相册 and 画廊图片具有 OneToMany/ManyToOne 关系:

One GalleryAlbum ==== can have ====> Many GalleryImage

Many GalleryImage === can be in ===> One GalleryAlbum

(来源如下)

问题是什么?

  1. 添加(上传)文件到图库相册

  2. $em->坚持($专辑)

  3. $em->flush()

  4. 对于每个上传的文件 GalleryAlbum 类创建一个新的 GalleryImage 实体并将其添加到 $images

  5. 我的 ECHO/EXIT 测试未显示(GalleryImage 名为 preUpload 的 prePersist/preUpdate 事件回调函数未触发!)

  6. 我的新图像没有保存到数据库中?为什么?

有什么奇怪的! If I do:

  1. 添加(上传)文件

  2. $em->坚持($专辑)

  3. $em->flush()

  4. 再次 $em->flush()

  5. 显示了我的 ECHO/EXIT 测试(触发了 GalleryImage 名为 preUpload 的 prePersist/preUpdate 事件回调函数!)

  6. (如果我删除 echo/exit)我的新 GalleryImages 现在已保存!

Why?

为什么我flush()一次就不会触发preUpload,而flush()两次就触发preUpload?

# src GalleryAlbum.php



    /**
     * @ORM\Entity
     * @ORM\HasLifecycleCallbacks
     * @ORM\Table(name="gallery_album")
     */
    class GalleryAlbum
    {
        // some properties like id, name, description, etc

        /**
         * @ORM\OneToMany(targetEntity="GalleryImage", mappedBy="parent")
         */
        protected $images;

        /* Files container. Used for upload service. Must not be persisted. */

        protected $files;    

        /* @ORM\Column(type="boolean", nullable=TRUE)
         *
         * if set to true will updateing object and calling preUpdate event callback
         * becouse it's always set to null in database by prePersist event callback */

        protected $files_added;

        /**
         * Set container files
         * 
         * @return GalleryAlbum
         */
         public function setFiles($files)
         {
             $this->files = $files;
             $this->files_added = true;
             /* setting files_added to true forces EntityManager to update 
              * this GalleryAlbum even if no other properties have changed */

             return $this;
         }

        /**
         * @ORM\PrePersist()
         * @ORM\PreUpdate()
         */
        public function preUpload()
        {
            if(null !== $this->files) {
                foreach($this->files as $key => $file) {
                  $this->addGalleryElement($file);
                  unset($this->files[$key]);
                }
            }
            /* Resetting property files_added to NULL 
             * so it always stays null in database */
            $this->files_added = null;
        }


        /**
         * Constructing new GalleryImage and setting it's file and parent
         */
        public function addGalleryElement($file)
        {      
            $element = new GalleryImage($this, $file);
            $this->addGalleryImage($element);
        }
    }
  

# src GalleryImage.php



    /**
     * @ORM\Entity
     * @ORM\HasLifecycleCallbacks
     * @ORM\Table(name="gallery_image")
     */
    class GalleryImage
    {
        // some properties like id, name, description, etc

        /**
         * @ORM\ManyToOne(targetEntity="GalleryAlbum", inversedBy="images")
         * @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
         */
        protected $parent;

        /* Constructing new GalleryImage */ 

        public function __construct($parent = null, $file = null)
        {
            if($parent) $this->setParent($parent);
            if($file) $this->setFile($file);     
        }

        /**
         * @ORM\PrePersist()
         * @ORM\PreUpdate()
         */
        public function preUpload()
        {
            echo 'TEST: is this event callback function fired?'; exit;

            if(null !== $this->file) {
                $this->path = $this->file->guessExtension();
            }

            $this->file_added = null;
        }
    }
  

第一次调用 persist 主义只会保存 $album 而不会保存它的图像。您必须通过在 $images 声明中指定来指定您希望学说级联持久化:

    /**
     * @ORM\OneToMany(targetEntity="GalleryImage", mappedBy="parent", cascade={"persist", "remove"})
     */
    protected $images;

这样,当您调用 persist($album) 时,它也会保留您的图像,并应在 GalleryImage 中触发 preUpload。有几种不同的选项可用于级联,这里对它们进行了很好的解释:

学说传递持久性级联操作 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-associations.html#transitive-persistence-cascade-operations

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

Symfony2:PrePersist/PreUpdate 生命周期事件未触发 的相关文章

  • 获取实体内的entityManager

    我想使用类似的东西 em this gt getEntityManager 在实体内部 我明白我应该将其作为一项服务但出于某些测试目的 我想从实体访问它 有可能实现吗 我尝试过 em this gt getEntityManager pro
  • Symfony 生产日志

    在 Symfony 3 中 我是否可以在不打开调试模式的情况下将所有错误写入生产日志 错误将包括 http 500 错误或应用程序错误或 php 错误 这些错误由于生产时错误标志设置为 false 而被静音 当前生产的日志配置是 monol
  • JPA 实体中的方法是否允许抛出异常?

    我尝试创建的 Entity 有问题 当尝试使用 OpenJPA 实现在 Eclipse 中测试类时出现问题 我有not尝试过其他人 所以不确定它是否适用于他们 我的测试用例非常简单 因为它创建一个 EntityManagerFactory
  • 将 json 反序列化为 Symfony 3.2 中的嵌入对象 - 预期参数类型为“Acme\StoreBundle\Document\Gps”,给定“array”

    Acme StoreBundle 文档 人 MongoDB Document class Person MongoDB bool private hasemail MongoDB EmbedOne targetDocument Gps pr
  • selenium-server:意外状态 SERVICE_PAUSED

    尝试在 Windows 10 中将 Selenium Server 安装为服务 使用 nssm 失败 并显示Unexpected status SERVICE PAUSED on nssm start selenium server Sel
  • Javascript dispatchEvent click 在 IE9 和 IE10 中不起作用

    我正在尝试在 ExtJs 中构建应用程序时模拟鼠标事件 例如单击 鼠标悬停等 我使用下面的代码来模拟点击 function triggerEvent element eventName if document createEvent var
  • 如何在react中监听localstorage值的变化?

    我想在用户登录时显示一个按钮 如果用户未登录 那么我不会显示按钮 当用户登录时 我将设置本地存储值 当我在登录组件中设置本地存储时 标头组件必须侦听该事件并且显示按钮 我正在使用 addEventListener 进行监听 但它没有监听 我
  • 在 symfony 2.1 中安装并运行 LiipImagineBundle

    以下是我遵循的步骤 在我的composer json中添加了以下内容 require imagine Imagine gt 0 2 8 liip imagine bundle dev 在命令行中运行以下命令 composer update
  • aws eb deploy 不加载环境变量

    我正在通过 eb deploy 将 symfony 项目部署到 ec2 实例 aws linux 2 部署后迁移脚本运行良好 但当我尝试使用 ec2 user 运行 symfony 命令时 出现有关数据库凭据错误的错误 这是因为我推送了带有
  • 在 Symfony2 中使用 assetic 加载一个 js 文件

    我是 Symfony 2 的新手 之前我经常使用 Codeigniter 现在我正在探索 assetic 我无法理解如何将单个文件添加到已经加载的 JS 文件堆栈中 我有一个主页树枝文件 其中包含以下内容 javascripts BlogB
  • 是否可以删除Android日历事件

    我正在使用 Android 日历 如何使用代码删除日历事件 是否可以 为了澄清起见 我想提一下 我不想要同步过程或想要使用 gdata api 删除事件 我只想删除本地日历事件 尝试使用事件 ID 的 Uri 删除事件 Uri uri UR
  • 是否有用于事件驱动的 Kafka 消费者的 Python API?

    我一直在尝试构建一个以 Kafka 作为唯一界面的 Flask 应用程序 因此 我希望有一个 Kafka 消费者 当相关主题的流中存在新消息时 该消费者会被触发 并通过将消息推回到 Kafka 流来进行响应 我一直在寻找类似 Spring
  • Java - 创建自定义事件和侦听器

    我正在尝试用 Java 创建自定义事件和侦听器 我已经看过这些文章和问题 在 Java 中创建自定义事件 https stackoverflow com questions 6270132 create a custom event in
  • 无法覆盖 Symfony2 GeneratorBundle 中的标准骨架视图

    我无法覆盖 GeneratorBundle 的骨架视图 我首先尝试在 app Resources SensioGeneratorBundle sculpt crud views index html twig 中添加我的视图 它不起作用 所
  • C# .Net Serial DataReceived 事件响应对于高速数据来说太慢

    我已经设置了一个 SerialDataReceivedEventHandler 并在 VS2008 Express 中使用基于表单的程序 我的串口设置如下 115200 8N1 Dtr 和 Rts 已启用 接收字节阈值 1 我有一个通过蓝牙
  • 覆盖默认标识符生成策略对关联没有影响

    交响乐 2 7 2 学说 ORM 2 4 7 MySQL 5 6 12 PHP 5 5 0 我有一个具有自定义 ID 生成器策略的实体 它工作完美 在某些情况下 我必须使用 手工制作 的 ID 来覆盖此策略 当主实体在没有关联的情况下被刷新
  • 在 C# 中调用事件处理程序

    我一直在尝试学习如何在 C 中使用事件处理程序 但我无法弄清楚 handler this e 在以下代码中的作用 public event EventHandler ThresholdReached protected virtual vo
  • 自定义 Facebook FOSFacebookBundle 登录按钮

    有人知道如何自定义 更改 FosFacebook 登录按钮的图像吗 facebook login button autologoutlink true 并在整页 Facebook 登录上重定向 而不是在弹出窗口上重定向 这使用了 twig
  • Sonata DateTimePickerType 类默认日期显示错误的日期时间格式

    我陷入困境 我不知道如何使用 sonata DateTimePickerType 类正确设置默认日期和时间 我尝试了不同的方法 但到目前为止 没有一种方法没有帮助 在下面的截图中 help 键显示正确的日期和时间 但是当我使用 dp 默认日
  • 使用原则 2 的 UniqueEntity

    我正在使用 Zend Framework 2 并且创建了一个用户实体 现在我试图使用户名字段唯一 但是出现以下错误 Semantical Error The annotation UniqueEntity in class User Ent

随机推荐