>  Q&A  >  본문

Symfony 6 상위 컨트롤러에서 하위 컨트롤러로의 종속성 주입

<p>모든 하위 컨트롤러가 사용하는 일부 유틸리티 메서드가 포함된 기본 컨트롤러 클래스가 있습니다. 현재는 3개의 종속성이 있지만 앞으로는 더 많아질 수 있습니다. 따라서 하위 컨트롤러에 종속성을 추가하려고 할 때마다 종속성 주입에 대한 지시문이 너무 많다고 생각되는 문제가 발생합니다. </p> <pre class="brush:php;toolbar:false;">추상 클래스 BaseController는 AbstractController를 확장합니다. { 공개 함수 __construct( 보호된 읽기 전용 SerializerInterface $serializer, 보호된 읽기 전용 ValidatorInterface $validator, 개인 읽기 전용 ResponseGenerator $responseGenerator, ) { } ... } ChildController 클래스는 BaseController를 확장합니다. { // 모든 하위 클래스에는 모든 상위 클래스 삽입이 필요합니다. 공개 함수 __construct( SerializerInterface $ 직렬 변환기, ValidatorInterface $검증기, 응답 생성기 $responseGenerator, 개인 읽기 전용 SomeRepository $someRepository, ...여기에 다른 하위 컨트롤러 관련 종속성을 삽입합니다. ) { parent::__construct($serializer, $validator, $responseGenerator); } ... }</pre> <p>기본 컨트롤러에서 <code>$this->container->get('serializer')</code>를 사용해 보았지만 <code>AbstractController: 때문에 작동하지 않았습니다. $container는 주입을 통해 정의되지만 생성자가 없으므로 <code>parent::__construct()를 호출할 수 없습니다. 또한 <코드>유효성 검사기</code>를 제공하지 않으므로 작동하더라도 문제의 일부만 해결합니다. </p> <p>다음과 같이 사용할 수 있는 속성을 찾아보았습니다. </p> <pre class="brush:php;toolbar:false;">추상 클래스 BaseController는 AbstractController를 확장합니다. { #[주입] 보호된 읽기 전용 SerializerInterface $serializer; #[주입] 보호된 읽기 전용 ValidatorInterface $validator;</pre> <p>그러나 비슷한 것은 발견되지 않았습니다(PHP-DI에는 있지만 Symfony에는 없습니다). </p> <p>하위 컨트롤러에서 중복 종속성을 어떻게든 제거할 수 있는 방법이 있습니까? </p>
P粉208469050P粉208469050449일 전526

모든 응답(1)나는 대답할 것이다

  • P粉464208937

    P粉4642089372023-08-18 00:22:33

    당신에게 필요한 것은 서비스 가입자

    라고 불리는 것

    Symfony에서 컨트롤러가 상속되면 AbstractController 서비스 구독자가 됩니다. 즉, 일부 공통 서비스(예: 나뭇가지, 직렬 변환기, 양식 빌더 등)가 포함된 작은 컨테이너에 주입된다는 의미입니다.

    하위 컨트롤러가 사용할 "공통" 서비스를 원하는 경우 상위 컨트롤러에서 해당 서비스를 재정의하여 목록을 확장할 수 있습니다getSubscribedServices(). 또는 컨트롤러가 Symfony에서 제공하는 기본 컨트롤러를 상속하지 않는 경우 자체 컨트롤러를 구현하기만 하면 됩니다.

    컨트롤러가 서비스인 경우(이미 서비스인 것 같습니다) Symfony는 setter 주입을 사용하여 컨트롤러에 컨테이너를 주입합니다.

    코드는 다음과 같습니다:

    으아악

    회신하다
    0
  • 취소회신하다