2014-05-22 15 views
9

Tôi có một dịch vụ trong Symfony2 trông giống như:Đi qua biến động một constructor dịch vụ

services: 
    MyCustomService: 
     class:  MyClass 
     arguments: //Arguments aren't static, but dynamic based on application logic. 

Có thể vượt qua các biến động để xây dựng một dịch vụ?

Có dường như không có bất kỳ tham số bổ sung trong vòng một của bộ điều khiển $this->get('MyCustomService');

Có cái gì tôi đang thiếu?

Trả lời

5

Nếu vì bất cứ lý do gì, bạn không thể cấu hình các dịch vụ sau instantiation (ví dụ: with a configurator). Điều gì về việc ủy ​​quyền trách nhiệm đó to a factory? Nó sẽ cho phép bạn khởi tạo dịch vụ với "đối số động".

services: 
    MyCustomServiceFactory: 
     class: MyClassFactory 
     arguments: [ @dynamicService, %time_prefix% ] 
    MyCustomService: 
     class:    MyClass 
     factory_service: MyCustomServiceFactory 
     factory_method:  get 

nhà máy của bạn muốn một cái gì đó như thế này:

class MyClassFactory 
{ 
    private $dynamicService; 
    private $timePrefix; 

    public function __construct(MyDynamicService $dynamicService, $timePrefix) 
    { 
     $this->dynamicService = $dynamicService; 
     $this->timePrefix = $timePrefix; 

    } 

    public function get() 
    { 
     // Dynamic arguments based on application logic. 
     $dynamicArg1 = $this->dynamicService->getArg() 
     $dynamicArg2 = $this->timePrefix . time(); 

     return new MyClass($dynamicArg1, $dynamicArg2); 
    } 
} 
+0

Yeah, tôi không thích lớp phải lo lắng về bản thân khi instantiating một nhà máy có ý nghĩa hơn. Tuy nhiên tôi vừa mới khởi tạo nhà máy một cách thủ công, sử dụng 'get ($ args)' và 'trả về MyClass mới ($ args)' trong trường hợp của tôi. Cảm ơn! – Tek

+0

Làm thế nào để bạn gọi nó? –

+1

Tôi cũng tò mò làm thế nào điều này được gọi là. Làm cách nào bạn chuyển vào% time_prefix% động? Đó vẫn là một tham số cần được định nghĩa trong tệp yaml afaik –

8

Với tôi, có vẻ như, bạn không hiểu từ "dịch vụ" thực sự có ý nghĩa gì. Những gì bạn đang cố gắng đạt được, sẽ không còn là một dịch vụ nữa.

Bạn vẫn có thể xác định phương thức setter bên trong "MyClass" cho bất kỳ đối số tùy chỉnh nào, trong khi xác định một số đối số mặc định, về cơ bản bạn ghi đè khi bạn sử dụng phương thức setter.

Bạn sẽ sử dụng một cái gì đó như thế này:

$this->get('MyCustomService')->setSomething($something); 
+0

Tôi đã tìm kiếm trong nhiều ngày và tôi không thể tìm thấy bất cứ nơi nào mà thực sự nói với tôi những gì một dịch vụ thực sự nghĩa là gì. Nó vô cùng bực bội. Tất cả tài liệu nói với tôi là nó là cái gì đó sử dụng container dịch vụ, và sau đó làm thế nào để viết một. Không nơi tôi có thể tìm thấy một lời giải thích về những gì họ là tốt nhất cho, mọi thứ có vẻ là 'hey dịch vụ yeah, họ đang mát mẻ ở đây là cách thực hiện một' –

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