2012-03-13 22 views
6

İ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çin

  1. ekleme (yükleme) dosyaları

  2. $ em-> inat Her yüklenen dosya için ($ albüm)

  3. $ em-> floş()

  4. GalleryAlbum sınıf oluşturur ve $ için görüntüleri

  5. 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!)

  6. Yeni resimlerim veritabanına kaydedilmiyor mu? Niye ya?

Garip olan nedir?Ben yaparsanız:

  1. (yükleme) dosyaları ekleme

  2. $ em-> inat ($ albüm)

  3. $ em-> floş()

  4. tekrar $ em-> floş()

  5. ECHO/EXIT testim gösteriliyor (pre -loadload adlı GalleryImage'ın prePersist/preUpdate olayı geri çağırma işlevi tetikleniyor!)

  6. (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; 
     } 
    } 

cevap

6

Eğer doktrin devam diyoruz ilk kez sadece $ albüm değil onun görüntüleri kaydeder. o da görüntüleri devam edecek ve GalleryImage içinde preUpload tetiklemelidir

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

Eğer ($ albüm) devam çağrı Bu şekilde: Eğer doktrin $ görüntüleri beyanında bunu belirterek inat basamakla istediğinizi belirtmelisiniz . Orada kaskatlama için kullanılabilir birkaç farklı seçenek vardır ve onlar da burada açıklanmıştır:

Doctrine transitive persistence cascade operations

+0

maalesef ekleyerek çağlayan = { "kaldır", "inat"} hatta çağlayan = { "bütün"} şey değişmez :( – loostro

+0

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

+0

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

İlgili konular