Nếu bạn cần thêm các đối tượng bổ sung, trình xử lý postPersist hoặc postUpdate trong Doctrine thật đáng buồn, không phải là nơi thích hợp. với cùng một vấn đề ngày hôm nay, khi tôi cần tạo một số mục tin nhắn trong trình xử lý đó.
Vấn đề tại điểm này là xử lý postPersist được gọi là trong sự kiện tuôn ra, chứ không phải sau đó. Ngoài ra, bạn không thể gọi tuôn ra trong một trình xử lý postPersist, vì điều này có thể dẫn đến các mục nhập ducplicate (như bạn đã từng trải qua)
Một cách để đi là sử dụng bộ xử lý onFlush từ học thuyết, tài liệu ở đây: http://doctrine-orm.readthedocs.org/en/latest/reference/events.html#onflush
Đây chỉ là vấn đề nếu bạn cần id chèn của đối tượng cơ sở dữ liệu, như là thực thể chưa được ghi vào cơ sở dữ liệu trong trình xử lý đó. Nếu bạn không cần những id đó, bạn sẽ ổn với sự kiện ofFlush trong học thuyết.
Đối với tôi, giải pháp hơi khác một chút. Tôi hiện đang làm việc trên một dự án symfony2 và cần các id của các đối tượng cơ sở dữ liệu được chèn (đối với các cuộc gọi lại và các bản cập nhật sau này).
Tôi đã tạo một dịch vụ mới trong symfony2, cơ bản chỉ hoạt động như một hàng đợi cho thư của tôi. Trong bản cập nhật postPersist, tôi chỉ cần điền vào các mục trong hàng đợi. Tôi có một trình xử lý khác đã đăng ký trên kernel.response
, sau đó lấy các mục đó và tiếp tục chúng vào cơ sở dữ liệu. (Một cái gì đó dọc theo dòng này: http://symfony.com/doc/current/cookbook/service_container/event_listener.html)
Tôi hy vọng tôi không phân loại quá nhiều từ chủ đề ở đây, nhưng vì nó là thứ tôi thực sự gặp khó khăn, tôi hy vọng một số người có thể thấy điều này hữu ích.
Các mục dịch vụ cho điều này là:
amq_messages_chain:
class: Acme\StoreBundle\Listener\AmqMessagesChain
amqflush:
class: Acme\StoreBundle\Listener\AmqFlush
arguments: [ @doctrine.orm.entity_manager, @amq_messages_chain, @logger ]
tags:
- { name: kernel.event_listener, event: kernel.response, method: onResponse, priority: 5 }
doctrine.listener:
class: Acme\StoreBundle\Listener\AmqListener
arguments: [ @logger, @amq_messages_chain ]
tags:
- { name: doctrine.event_listener, event: postPersist }
- { name: doctrine.event_listener, event: postUpdate }
- { name: doctrine.event_listener, event: prePersist }
Bạn không thể sử dụng doctrine.listener
cho điều này, vì điều này dẫn đến một sự phụ thuộc hình tròn (như bạn cần người quản lý tổ chức cho các dịch vụ, nhưng người quản lý thực thể cần dịch vụ ....)
Điều đó hoạt động như một sự quyến rũ. Nếu bạn cần thêm thông tin về điều đó, đừng ngần ngại hỏi, tôi rất vui khi thêm một số ví dụ vào điều này.
Thx! Bạn có thể cho tôi liên kết tới tài liệu về sự kiện này không? Là tuôn ra thực sự được phép trong phương pháp này? – nucleartux
Tôi không thể tìm thấy bất kỳ tham chiếu nào trong tài liệu, tôi đã tìm thấy nó trong mã ([UnitOfWork :: commit()] (https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/ UnitOfWork.php # L245)). Những sự kiện này được kích hoạt ngay từ đầu và cuối của tuôn ra để an toàn của nó tuôn ra một lần nữa ở đó (tôi đã thử). –
PostFlush có bất kỳ điều gì trong getScheduledEntityInsertions() hay không. Nếu tôi không tìm thấy nó. Nó trống rỗng đối với tôi; Tôi đang suy nghĩ bởi vì chèn đã xảy ra. –