13

Có cơ hội nào để làm cho bộ điều khiển phụ thuộc vào dịch vụ của họ không thông qua việc sử dụng thùng chứa dịch vụ bên trong chúng hay không.Symfony 2: Dependency injection (DI) của bộ điều khiển

Tôi muốn viết điều khiển theo cách này:

<?php 

class ArticleController extends \Symfony\Bundle\FrameworkBundle\Controller\Controller 
{ 
    private $articleFacade; 
    private $articleRepository; 

    public function __construct(ArticleFacade $articleFacade, ArticleRepository $articleRepository) 
    { 
     $this->articleFacade = $articleFacade; 
     $this->articleRepository = $articleRepository; 
    } 

    public function indexAction() 
    { 
     ... 
    } 

} 

Unfortunatelly như tôi có thể nhìn thấy Symfony ControllerResolver làm trường mới Kiểm soát không qua ServiceContainer nhưng qua đơn giản return new $controller gọi.

Trả lời

12

Tuyệt đối trong thực tế nó được khuyến khích và nếu bạn nhìn vào hầu hết các nhóm bên thứ ba như FOSUser bạn có thể thấy rằng đó là chính xác những gì họ làm.

Bí quyết là xác định bộ điều khiển của bạn dưới dạng dịch vụ và sau đó sử dụng id dịch vụ thay vì tên lớp.

http://symfony.com/doc/current/cookbook/controller/service.html

Hãy ghi nhớ rằng bạn sẽ phải tiêm tất cả các dịch vụ cần thiết của bạn chẳng hạn như các nhà quản lý tổ chức và bạn thường sẽ không mở rộng các lớp cơ sở symfony. Tất nhiên bạn có thể tiêm container hoàn chỉnh nhưng điều đó có xu hướng được cau mày.

+0

Cảm ơn câu trả lời của bạn. –

+1

Hãy xem [AbstractControllerBundle] của tôi (https://github.com/elnur/ElnurAbstractControllerBundle). Nó có nghĩa là cung cấp cho bạn một [dịch vụ phụ huynh] (http://symfony.com/doc/current/cookbook/service_container/parentservices.html) để đơn giản hóa việc sử dụng các bộ điều khiển như các dịch vụ. –

+9

Nó không giống với tôi như FOSUser thực hiện điều này? Tôi có thiếu điểm không? Câu hỏi của Václav là về việc tiêm chúng thông qua phương thức khởi tạo, trong khi FOSUser thực hiện $ this-> container-> get ('service'); https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Controller/RegistrationController.php – Steve

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