2012-01-13 35 views
7

Tôi đang cố gắng xây dựng dịch vụ đơn giản để hiển thị các loại trang khác nhau. Khái niệm cơ bản là có một cái gì đó như:Mô hình chiến lược trong Symfony2

$somePageType = new PageType(...); 
$this->get('page.service')->render($somePagetype); 

... được thiết kế là Strategy pattern. Các loại trang sẽ triển khai giao diện với phương thức renderpage.service sẽ gọi nó. Vấn đề là tôi muốn sử dụng Doctrine trong các lớp kiểu trang. lựa chọn của tôi là gì đây? Tôi muốn tránh tạo dịch vụ cho từng lớp học này. Điều đó thậm chí có thể? Có thể làm cho chúng nhận biết được container mà không cần dịch vụ không? Có thể, trong tương lai, một số loại trang có thể cần một cái gì đó nhiều hơn chỉ có Doctrine, vì vậy tôi cần phải ghi nhớ điều đó.

Trả lời

1

Tôi giả định PageType là ví dụ về lớp chiến lược. Trong trường hợp đó, bạn có thể tiêm các phụ thuộc theo số page.service và bạn sẽ không cần phải xác định chiến lược là dịch vụ.

Mỗi chiến lược có thể phụ thuộc vào các đối tượng khác nhau và do đó tôi đoán bạn có thể làm cho chúng ContainerAware. Dưới đây là một ví dụ làm thế nào để làm điều đó

// This is the page.service class 
class MyPageService { 

    public function render(PageTypeInterface $page_type) { 
     $page_type->setContainer($this->container); 

     // do stuff 
    } 
} 

// This is the type strategy 
class MyStrategyType extends ContainerAware implements PageTypeInterface { 
    // you can access the container after MyPageService has injected it. 
} 

Vì vậy, về cơ bản mỗi chiến lược sẽ mở rộng ContainerAwarepage.service sẽ bơm thùng sơn.


EDIT

Nếu tất cả các chiến lược của bạn phụ thuộc vào các dịch vụ tương tự, tôi muốn tiêm cho họ thay vì toàn bộ container.

class MyPageService { 

    public function render(PageTypeInterface $page_type) { 
     $page_type->setService($this->container->get('my_service')); 

     // do stuff 
    } 
} 
+0

Không tốt để vượt qua vùng chứa xung quanh. Nếu đối tượng của anh ta yêu cầu học thuyết, anh ta nên yêu cầu nó bằng cách thêm một tham số trong hàm tạo cho đối tượng doctrine. – meze

+0

@meze tất nhiên, nhưng điều gì sẽ xảy ra nếu mọi chiến lược có các phụ thuộc khác nhau. Đây sẽ là cách duy nhất. Tuy nhiên, cá nhân tôi sẽ xác định tất cả các chiến lược như dịch vụ thực sự. – gilden

+0

và bạn sẽ kiểm tra chiến lược của mình như thế nào? tái sử dụng trong một dự án khác mà không có symfony? – meze

3

Dịch vụ chính xác là những gì bạn muốn ở đây. Có thể tiêm phụ thuộc cho chiến lược cụ thể được đề cập. Sau đó, tiêm chiến lược cụ thể vào bộ điều khiển (cũng có thể là một trình kết xuất động mà chọn chiến lược khi chạy).

Bộ chứa thực phẩm là một thực tế không tốt, nó kết hợp đối tượng được đề cập đến tất cả của các dịch vụ trong vùng chứa. Vì vậy, tôi khuyên bạn nên tránh nó.

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