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