Symfony 6 상위 컨트롤러에서 하위 컨트롤러로의 종속성 주입
P粉208469050
2023-08-17 20:19:03
<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>
당신에게 필요한 것은 서비스 가입자
라고 불리는 것Symfony에서 컨트롤러가 상속되면
AbstractController
서비스 구독자가 됩니다. 즉, 일부 공통 서비스(예: 나뭇가지, 직렬 변환기, 양식 빌더 등)가 포함된 작은 컨테이너에 주입된다는 의미입니다.하위 컨트롤러가 사용할 "공통" 서비스를 원하는 경우 상위 컨트롤러에서 해당 서비스를 재정의하여 목록을 확장할 수 있습니다
getSubscribedServices()
. 또는 컨트롤러가 Symfony에서 제공하는 기본 컨트롤러를 상속하지 않는 경우 자체 컨트롤러를 구현하기만 하면 됩니다.컨트롤러가 서비스인 경우(이미 서비스인 것 같습니다) Symfony는 setter 주입을 사용하여 컨트롤러에 컨테이너를 주입합니다.
코드는 다음과 같습니다:
으아악