2012-04-27 15 views
9

Tôi đã làm theo hướng dẫn từ hướng dẫn này: http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html và đã tạo một trình nghe đơn giản, lắng nghe các sự kiện được Doctrine gửi đi khi chèn hoặc cập nhật thực thể. Các sự kiện preInsert và postInsert hoạt động tốt và được gửi đi khi tạo một thực thể mới. Tuy nhiên, preUpdate và postUpdate không bao giờ được gọi là cập nhật của thực thể cho dù là gì. Cũng vậy với onFlush. Là một lưu ý phụ, tôi có một bộ điều khiển tạo ra bộ điều khiển hỗ trợ các hoạt động CRUD cơ bản, và đã để nó bị ảnh hưởng.preUpdate và postUpdate sự kiện không được kích hoạt trên Doctrine 2

Dưới đây là một số đoạn mã để minh họa cách tôi đang thực hiện việc này.

config.yml

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

Listener thực hiện (Tôi đã bỏ qua các chức năng khác và để lại chỉ postUpdate cho các mục đích đơn giản)

class AnnotationListener 
{ 

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

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

id thực thể không bao giờ được hiển thị, và kịch bản tiếp tục thực hiện của nó cho đến khi nó hoàn tất, mặc dù chết ở cuối hàm.

Trả lời

13

Bạn đã quên thêm @HasLifecycleCallbacks chú thích? Bạn có thể sử dụng toàn bộ nghĩa vụ chú thích và bỏ qua định nghĩa dịch vụ @PreUpdate.

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

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

Theo tôi cách này gắn các sự kiện dễ dàng hơn nhiều khi bạn không cần phải xác định các dịch vụ mới và người nghe rõ ràng. Ngoài ra, bạn có quyền truy cập trực tiếp vào dữ liệu đang được cập nhật vì phương pháp này là vị trí trong thực thể của bạn.

Bây giờ, nhược điểm là bạn kết hợp logic với mô hình của bạn và đó là cái gì đó nên tránh nếu có thể ...

Bạn có thể đọc thêm về Vòng đời callbacks đây: http://symfony.com/doc/master/cookbook/doctrine/file_uploads.html#using-lifecycle-callbacks

+2

đúng ... Tuy nhiên , Tôi phải sử dụng các thực thể khác và chính người quản lý thực thể, và có thể là các dịch vụ khác, vì vậy nó sẽ không là một ý tưởng hay. Dù sao, có vẻ như vấn đề đã được giải quyết ngay bây giờ. Tôi đã cập nhật lên phiên bản mới nhất của Symfony, xóa bộ nhớ cache và mọi thứ đang hoạt động. – tomor

+0

À vâng, nếu bạn đang sử dụng các dịch vụ/tổ chức khác, điều đó có nghĩa là không đi theo cách này :) –

Các vấn đề liên quan