Abh?ngigkeitsinjektion des übergeordneten Symfony 6-Controllers zum untergeordneten Controller
P粉2084690502023-08-17 20:19:03
0
1
683
<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>
<?php
use Symfony\Contracts\Service\ServiceSubscriberInterface;
class ParentController implement ServiceSubscriberInterface {
protected ContainerInterface $container;
public function setContainer(ContainerInterface) { $this->container = $container; }
public static function getSubscribedServices() {
// 這是靜態(tài)的,所以Symfony可以在不實例化控制器的情況下“看到”所需的服務(wù)。
// 在這里定義一些常見的服務(wù),一個示例在Symfony的AbstractController中
}
}
class ChildController extends ParentController {
// 使用自定義DI來為子控制器提供服務(wù)。
public function indexAction {
// 你可以使用$this->container->get(...)來獲取服務(wù)
}
}