2012-07-10 30 views
7

Hiện tại tôi đã có một cá thể chứa Symfony2 DI sẵn sàng với một dịch vụ và tất cả phụ thuộc của nó. Cho phép nói ví dụ tôi có một lớp Car và nó có Engine và Lights là phụ thuộc. Trong thiết lập hiện tại của tôi, cả hai phụ thuộc này đều được tạo tự động thông qua phép setter khi đối tượng Car được tạo, nhưng nó có thể rất tốt là đối tượng Car của tôi không cần đèn trong khoảng thời gian này. để tạo ra một thể hiện của sự phụ thuộc này.Tải phụ thuộc lười biếng với symfony DI

Có cách nào để đạt được điều này trong Symfony DI không? Vì vậy, chỉ tạo ra một thể hiện của đối tượng Lights khi cần thiết? Đoán của tôi là nó sẽ là một số loại thực hiện Proxy như Doctrine có nhưng theo như tôi đã thấy nó không tồn tại trong Symfony DI.

Trả lời

2

Chích dedendencies mà là bắt buộc thông qua các Constructor qua services.yml của bạn, tự động.
Nếu bạn có các phụ thuộc tùy chọn, hãy tiêm chúng thông qua bộ cài đặt trong Bộ điều khiển của bạn khi bạn cần chúng.

$this->container->get('cars')->setLights(new \Namespace\Lights()); 

Tất nhiên lớp Xe hơi của bạn phải được thiết kế như vậy và bạn phải tự chích trực tiếp vào bộ điều khiển của mình hoặc bất cứ nơi nào cần thiết.

1

Một câu hỏi rất thú vị, nhưng tôi không nghĩ rằng nó có thể trong Container phụ thuộc của Symfony2. Vùng chứa chỉ nhận thức được những gì bạn nói - trong trường hợp này, bạn có một sự phụ thuộc có điều kiện đối với một ca sử dụng cụ thể. Ngoài ra, việc đăng ký dịch vụ diễn ra sớm trong cuộc sống của ứng dụng, vì vậy tôi không thấy cách bạn có thể làm việc này.

Có thể bạn nên sử dụng mẫu Nhà máy. Đăng ký CarFactory làm dịch vụ và sau đó khi tìm nạp một cá thể Car, bạn có thể chỉ định rằng nó phải bao gồm sự phụ thuộc Light.

Tôi có thể hỏi lý do bạn muốn đạt được điều này không? Có thể có một giải pháp đơn giản hơn.

+0

Trong trường hợp của tôi, tôi đang triển khai thành phần DI độc lập vào một dự án ZF cũ hơn. Tôi đã có một số lớp Service (AdminService, UserService, ...) mà tất cả đều có các phụ thuộc như DBAL, ACL, vv .. Đây là những yêu cầu thực tế cho lớp dịch vụ hoạt động chính xác. Mặt khác, có các trường hợp như Biểu mẫu và Mô hình chỉ được sử dụng trong một số phương thức của ServiceClass. Đây là những phụ thuộc "có điều kiện". Tôi nghĩ rằng nó cũng khá nhiều không thể trừ khi Symfony DI có một hệ thống proxy như học thuyết sử dụng cho các thực thể của nó. – ChrisR

0

Nó không phải là một giải pháp khá tốt, nhưng bạn có thể thử tiêm toàn bộ DIC, sau đó nhận được các dịch vụ ánh sáng và động cơ khi cần thiết.

Tôi đã suy nghĩ về một cái gì đó giống như phương pháp này trong lớp Car:

protected function getLightService() 
{ 
    if (!$this->light) { //so we reuse the first instance 
     $this->light = $this->dic->get("car.light"); 
    } 

    return $this->light; 
} 
+0

Hiện tại tôi không tiêm container DI nhưng tham chiếu nó từ FrontController ZF như thế này: 'Zend_Controller_Front :: getInstance() -> getParam ('bootstrap') -> getDic()'. Có lý do nào để không làm như thế này không? – ChrisR

+0

Tôi không có kinh nghiệm với ZF, vì vậy tôi không thể trả lời. Nếu nó hoạt động tốt cho bạn, tôi đoán nó là ok. – Maerlyn

2

Câu hỏi đã được trả lời, nhưng đối với những người cần chức năng này, dịch vụ lười được thực hiện trong Symfony 2.3.

Bạn cần cài đặt ProxyManager bridge.

Bạn có thể tìm thấy tài liệu chính thức here.

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