13

컨트롤러는 서비스 컨테이너를 사용하지 않고 순수한 생성자 종속성 주입을 통해 서비스에 의존하게 할 수 있습니까?Symfony 2 : 컨트롤러의 DI (Dependency Injection)

나는이 방법으로 컨트롤러를 작성하려합니다 :

<?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 내가 심포니 ControllerResolver하지 ServiceContainer를 통해 간단하지만 return new $controller 호출을 통해 컨트롤러의 새로운 인스턴스를 않는 볼 수 있습니다.

답변

12

사실 실제로 권장됩니다. FOSUser와 같은 대부분의 제 3 자 번들을 살펴 본다면 그것이 정확히 무엇인지 알 수 있습니다.

트릭은 컨트롤러를 서비스로 정의한 다음 클래스 이름 대신 서비스 ID를 사용하는 것입니다.

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

당신은 엔티티 관리자 등 모든 필요한 서비스를 주입해야합니다 명심하고 보통 심포니 기본 클래스를 확장하지 않습니다. 당연히 당신은 완전한 용기를 주입 할 수 있습니다. 그러나 그것은 찌그러지는 경향이 있습니다.

+0

답변 해 주셔서 감사합니다. –

+1

내 [AbstractControllerBundle] (https://github.com/elnur/ElnurAbstractControllerBundle)을 살펴보십시오. 컨트롤러를 서비스로 단순화하기 위해 [상위 서비스] (http://symfony.com/doc/current/cookbook/service_container/parentservices.html)를 제공하기위한 것입니다. –

+9

FOSUser가하는 것처럼 보이지 않습니다. 요점을 놓치고 있습니까? Václav의 질문은 FOSUser가 $ this-> container-> get ('service')를 수행하는 동안 생성자 메소드를 통해 주입하는 것이 었습니다. https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Controller/RegistrationController.php – Steve

관련 문제