Abhängigkeitsinjektion des übergeordneten Symfony 6-Controllers zum untergeordneten Controller
P粉208469050
2023-08-17 20:19:03
<p>Ich habe eine Basis-Controller-Klasse, die einige Dienstprogrammmethoden enthält, die alle untergeordneten Controller verwenden. Derzeit gibt es drei Abhängigkeiten, aber in Zukunft könnten es noch mehr sein. Wenn ich also eine Abhängigkeit zu einem untergeordneten Controller hinzufügen möchte, habe ich jetzt ein Problem, bei dem ich denke, dass es zu viele Anweisungen für die Abhängigkeitsinjektion gibt. </p>
<pre class="brush:php;toolbar:false;">Die abstrakte Klasse BaseController erweitert AbstractController
{
öffentliche Funktion __construct(
protected readonly SerializerInterface $serializer,
protected readonly ValidatorInterface $validator,
privater schreibgeschützter ResponseGenerator $responseGenerator,
) {
}
...
}
Die Klasse ChildController erweitert BaseController
{
// Alle Injektionen der übergeordneten Klasse sind in allen untergeordneten Klassen erforderlich.
öffentliche Funktion __construct(
SerializerInterface $serializer,
ValidatorInterface $validator,
ResponseGenerator $responseGenerator,
privates schreibgeschütztes SomeRepository $someRepository,
...fügen Sie hier alle anderen untergeordneten Controller-spezifischen Abhängigkeiten ein.
) {
parent::__construct($serializer, $validator, $responseGenerator);
}
...
}</pre>
<p>Ich habe versucht, <code>$this->container->get('serializer')</code> im Basiscontroller zu verwenden, aber das hat nicht funktioniert, weil <code>AbstractController: $container</code> wird durch Injektion definiert, hat aber keinen Konstruktor, daher kann <code>parent::__construct()</code> Außerdem gibt es mir keinen <code>Validator</code>, sodass es, selbst wenn es funktioniert, nur einen Teil des Problems löst. </p>
<p>Ich habe versucht, nach Eigenschaften zu suchen, die ich verwenden könnte, wie </p>
<pre class="brush:php;toolbar:false;">Die abstrakte Klasse BaseController erweitert AbstractController
{
#[Injizieren]
protected readonly SerializerInterface $serializer;
#[Injizieren]
protected readonly ValidatorInterface $validator;</pre>
<p>Aber es wurde nichts Ähnliches gefunden (PHP-DI hat es, aber Symfony nicht). </p>
<p>Gibt es eine Möglichkeit, doppelte Abhängigkeiten in untergeordneten Controllern irgendwie zu beseitigen? </p>
你需要的是被称为服务订阅者
在Symfony中,当控制器继承
AbstractController
时,它们是服务订阅者,这意味着它们被注入了一个包含一些常用服务(如twig、序列化器、表单构建器等)的小容器。如果你想要一些你的子控制器将使用的“常见”服务,你可以通过在父控制器中重写
getSubscribedServices()
来扩展列表。或者如果你的控制器没有继承Symfony提供的默认控制器,你只需要实现自己的控制器:如果你的控制器是一个服务(我猜已经是了),Symfony将使用setter注入将容器注入到你的控制器中。
代码将如下所示: