Symfony 6 상위 컨트롤러에서 하위 컨트롤러로의 종속성 주입
P粉208469050
P粉208469050 2023-08-17 20:19:03
0
1
554
<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粉208469050
P粉208469050

모든 응답(1)
P粉464208937

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

라고 불리는 것

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

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

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

코드는 다음과 같습니다:

으아악
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿