2012-01-21 40 views
5

Tôi có một lớp học thường xuyên trong dự án Symfony2 tôi:dịch vụ truy cập bên trong một lớp thông thường

class RangeColumn extends Column{ 
     //... 
    } 

Bây giờ bên trong lớp này là một render chức năng, trong đó tôi muốn sử dụng cành hoặc Dịch vụ dịch của Symfony2 để hiển thị một mẫu cụ thể. Làm thế nào để tôi truy cập các dịch vụ này một cách thích hợp?

Trả lời

10

Sử dụng dependency injection. Đó là một khái niệm thực sự đơn giản.

Bạn chỉ cần chuyển (tiêm) các dịch vụ cần thiết cho lớp học của mình.

Nếu phụ thuộc là bắt buộc chuyển chúng trong một nhà xây dựng . Nếu chúng là , hãy chọn sử dụng số setters.

Bạn có thể tiến xa hơn và ủy quyền xây dựng lớp học của mình cho vùng chứa phụ thuộc (tạo dịch vụ ra khỏi vùng chứa).

Dịch vụ không khác với lớp "thông thường" của bạn. Nó chỉ là xây dựng của họ được giao cho container.

11

Mã dụ:

<?php 

class MyRegularClass 
{ 
    private $translator; 

    public function __construct(Translator $translator) 
    { 
     $this->translator = $translator; 
    } 

    public function myFunction() 
    { 
     $this->translator->trans('sentence_to_translate'); 
    } 
} 

Và nếu bạn muốn lớp học của bạn để trở thành một dịch vụ: Trong file services.yml của bạn nằm trong nhóm của mình,

parameters: 
    my_regular_class.class: Vendor\MyBundle\Classes\MyRegularClass 

services: 
    mybundle.classes.my_regular_class: 
     class: %my_regular_class.class% 
     arguments: [@translator] 

Để biết thêm chi tiết, xem chương về Symfony2 Service Container

+2

Sự phụ thuộc Thẻ tiêm là '@ translator.default' bởi Symfony 2.6, thẻ' @ translator' tham chiếu đến LoggingTranslator bây giờ. – Lashae

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