2012-11-11 25 views
9

Tôi đang sử dụng Doctrine 2 trong ứng dụng Zend Framework 2. Có cách nào bằng cách sử dụng ZF2 để tiêm phụ thuộc vào các thực thể trả về bởi Doctrine? Các thực thể được xây dựng bởi Doctrine khi được lấy ra từ cơ sở dữ liệu. Cho đến khi tôi biết để tiêm phụ thuộc vào ZF2 tôi cần phải nhanh chóng thực thể bằng cách sử dụng Service Locator. Tôi không thể thấy cách tôi có thể tích hợp nó với Doctrine mà không phải sửa đổi cơ sở mã Doctrines. Giải pháp khả thi duy nhất mà tôi có thể thấy ngay bây giờ là viết một dịch vụ nhỏ, lấy kết quả trả về từ Doctrine và tiêm các phụ thuộc cần thiết. Có một giải pháp thanh lịch hơn không?ZF2 với Doctrine 2 - Tiêm phụ thuộc vào các thực thể

Trân trọng Christian

+0

gì chính xác bạn có muốn tiêm không? Tôi không thể nghĩ ra một trường hợp có ý nghĩa khi đưa thứ gì đó vào một thực thể. Tôi chắc chắn có một cách để làm những gì bạn muốn phù hợp trong khái niệm này. –

+0

Tôi đã thực hiện một hướng khác trong thời gian chờ đợi. Những thứ tôi muốn ủy thác cho các thực thể hiện nay được giao cho một dịch vụ, quản lý các thực thể. Vì vậy, không cần thêm bất kỳ thứ gì để đưa vào thực thể – griesi

Trả lời

16

Nhìn vào Học thuyết EventManager, đặc biệt, sự kiện postLoad vòng đời, mà là bắn bằng EventManager mỗi khi một thực thể được tải từ cơ sở dữ liệu.

Để ghép tất cả vào ZF2, bạn sẽ cần thực hiện một vài điều.

Đầu tiên, hãy viết một Học thuyết-Flavored nghe sự kiện:

<?php 
class InjectStuffListener { 
    private $sl; 

    public function __construct($serviceLocator){ 
     $this->sl = $serviceLocator; 
    } 

    public function postLoad($eventArgs){ 
     $entity = $eventArgs->getEntity; 
     $entity->setThingToBeInjected($this->sl->get('some.thing')); 
    } 
} 

Sau đó, trong một nơi nào đó như một số Module.php (có thể có một vị trí tốt hơn so với onBootstrap, nhưng bất cứ điều gì):

<?php 
public function onBootstrap(){ 
    $sm = $e->getApplication()->getServiceManager(); 
    $em = $sm->get('doctrine.entitymanager.orm_default'); 
    $dem = $em->getEventManager(); 
    $dem->addEventListener(array(\Doctrine\ORM\Events::postLoad), new InjectStuffListener($sm)); 

} 
+0

Có nhưng tôi không thể thấy cách tôi có thể kết nối điều này với trình quản lý dịch vụ/định vị dịch vụ ZF2 để tiêm phụ thuộc được quản lý bởi ZF2. Bản thân thực thể không biết về trình định vị dịch vụ vì nó không được khởi tạo thông qua bộ định vị dịch vụ. – griesi

+0

@griesi - xem chỉnh sửa của tôi đối với một số mã ví dụ khởi tạo người nghe và đính kèm chúng vào EventManager của học thuyết trong quá trình khởi động ZF2. – timdev

+0

Cảm ơn điều này là chính xác tôi đã tìm kiếm – griesi

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