2012-04-27 22 views
9

Bu eğiticinin talimatlarını takip ettim: http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html ve basit bir dinleyici oluşturduk. Bu, bir nesnenin eklenmesi veya güncellenmesi üzerine Doktrin tarafından gönderilen olayları dinleyen basit bir dinleyici oluşturdu. PreInsert ve PostInsert olayları iyi çalışıyor ve yeni bir oluşumun yaratılmasında yollanıyor. Ancak, ne olursa olsun, varlığın güncellemesinde preUpdate ve postUpdate hiçbir zaman çağrılmaz. Aynı, onFlush için de geçerlidir. Bir yan not olarak, temel CRUD işlemlerini destekleyen ve el değmeden bırakılmış bir konsol oluşturucu denetleyicim var.DoTakTrin 2 tetiklenmeyen preUpdate ve postUpdate olayları 2

Bunu yaptığım şekilde göstermek için bazı kod parçacıkları aşağıda verilmiştir.

config.yml

annotation.listener: 
    class: City\AnnotatorBundle\Listener\AnnotationListener 
    tags: 
     - { name: doctrine.event_listener, event: postUpdate} 

Dinleyici uygulaması (ben diğer işlevleri atladık ve basitlik amacıyla sadece postUpdate sol)

class AnnotationListener 
{ 

    public function postUpdate(LifecycleEventArgs $args) 
    { 
     $entity=$args->getEntity(); 

     echo $entity->getId(); 
     die; 
    } 
} 

varlık kimliği görüntülenir asla ve komut dosyası devam Tamamlanana kadar yürütme, işlevinin sonuna ölmesine rağmen.

cevap

13

@HasLifecycleCallbacks annotaion eklediniz mi? @PreUpdate ek açıklamasını kullanabilir ve hizmet tanımını tamamen atlayabilirsiniz. Bence

/** 
* @ORM\Entity 
* @ORM\HasLifecycleCallbacks 
*/ 
class YouEntity 
{ 

    /** 
    * @ORM\PrePersist() 
    * @ORM\PreUpdate() 
    */ 
    public function preUpdate(){ 
     // .... your pre-update logic here 
    } 
    .... 
} 

olayları ekleyerek bu yolu yeni hizmet ve dinleyicileri açıkça tanımlamak gerekmez olarak çok daha kolaydır. Ayrıca, bu yöntem, varlığınızdaki konumlar olduğundan, güncelleştirilmekte olan verilere doğrudan erişebilirsiniz. Ancak ... Gerçek http://symfony.com/doc/master/cookbook/doctrine/file_uploads.html#using-lifecycle-callbacks

+2

:

Şimdi Ömrü burada geri aramalar hakkında

Daha okuyabilirsiniz ... dezavantajı size modeliyle mantığı karıştırmak olduğunu ve mümkünse kaçınılması gereken bir şey var , Diğer varlıkları ve varlık yöneticisinin kendisini ve muhtemelen diğer hizmetleri kullanmalıyım, bu yüzden iyi bir fikir olmaz. Her neyse, sorun şimdi çözülmüş gibi görünüyor. Symfony'nin son sürümüne güncelledim, önbelleği temizledim ve her şey çalışıyor. – tomor

+0

Ah evet, başka hizmetler/varlıklar kullanıyorsanız, bu şekilde gitmemek anlamsızdır :) –