Symfony2: Evento de ciclo de vida PrePersist / PreUpdate não disparado

Duas Entidades GalleryAlbum e GalleryImage tenha um relacionamento OneToMany / ManyToOne:

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

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

(fontes abaixo)

Qual é o problema

Adicionar (carregar) arquivos ao GalleryAlbum

$ em-> persistir ($ álbum)

$ em-> flush ()

Para cada arquivo carregado, a classe GalleryAlbum cria e adiciona a $ images uma nova entidade GalleryImage

Meu teste ECHO / EXIT não é exibido (a função de retorno de chamada de evento prePersist / preUpdate da GalleryImage chamada preUpload não é acionada!)

Minhas novas imagens não são salvas no banco de dados? Por quê

O que é estranho! Se eu fizer

Adicionando (carregando) arquivos

$ em-> persistir ($ álbum)

$ em-> flush ()

again $ em-> flush ()

Meu teste ECHO / EXIT é exibido (a função de retorno de chamada de evento prePersist / preUpdate da GalleryImage chamada preUpload é acionada!)

(se eu excluir eco / sair) Minhas novas GalleryImages são salvas agora !!!

Por quê

Por que o pré-upload nunca é acionado quando eu libero () uma vez e é acionado quando eu libero () duas vezes?

# 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;
        }
    }

questionAnswers(2)

yourAnswerToTheQuestion