İki Varlıkları GalleryAlbum ve GalleryImage ateş etmemiş sahip OneToMany/ManyToOne ilişkisi:Symfony2'nin: PrePersist/PreUpdate yaşam döngüsü olay
One GalleryAlbum ==== can have ====> Many GalleryImage
Many GalleryImage === can be in ===> One GalleryAlbum
(aşağıda kaynaklar)
Sorun nedir? GalleryAlbum
içinekleme (yükleme) dosyaları
$ em-> inat Her yüklenen dosya için ($ albüm)
$ em-> floş()
GalleryAlbum sınıf oluşturur ve $ için görüntüleri
Benim ECHO/ÇIKIŞ testi hayır yeni GalleryImage varlık katar t gösterilir (preImage adlı GalleryImage'ın prePersist/preUpdate olay geri çağırma işlevi tetiklenmez!)
Yeni resimlerim veritabanına kaydedilmiyor mu? Niye ya?
Garip olan nedir?Ben yaparsanız:
(yükleme) dosyaları ekleme
$ em-> inat ($ albüm)
$ em-> floş()
tekrar $ em-> floş()
ECHO/EXIT testim gösteriliyor (pre -loadload adlı GalleryImage'ın prePersist/preUpdate olayı geri çağırma işlevi tetikleniyor!)
(echo/exit'i silersem) Yeni galeri görüntülerim şimdi kaydedildi !!!
Neden?
Ben fışkırma neden preUpload tetiklenir asla() bir kez ve Ben fışkırma tetiklenir() iki kez?
# 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; } }
maalesef ekleyerek çağlayan = { "kaldır", "inat"} hatta çağlayan = { "bütün"} şey değişmez :( – loostro
Bu garip. Birkaç gün önce aynı problemi yaşadım ve bu benim için düzeltildi. Eğer başka bir şey düşünürsem geri döneceğim. – user1207727
Tamam, neden çift sifonun çalıştığını biliyorum. "PrePersist'de yeni varlıklar oluşturuyorum. "Bu, doktrin ORM'in hangi varlıkların kalıcı olması gerektiğini hesapladığı anlamına gelir. Bu nedenle, ilk kez çalkalanırken - sadece ALBUM kalıcılığı devam eder. İkinci çağda doktrini çağrıldığında, yeni varlıkları sürdürebilir ve bu yüzden onları kurtarır. 2. yıkamadan sonra veritabanı. – loostro