Heim  >  Fragen und Antworten  >  Hauptteil

Abhängigkeitsinjektion des übergeordneten Symfony 6-Controllers zum untergeordneten Controller

<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>
P粉208469050P粉208469050451 Tage vor529

Antworte allen(1)Ich werde antworten

  • P粉464208937

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

    你需要的是被称为服务订阅者

    在Symfony中,当控制器继承AbstractController时,它们是服务订阅者,这意味着它们被注入了一个包含一些常用服务(如twig、序列化器、表单构建器等)的小容器。

    如果你想要一些你的子控制器将使用的“常见”服务,你可以通过在父控制器中重写getSubscribedServices()来扩展列表。或者如果你的控制器没有继承Symfony提供的默认控制器,你只需要实现自己的控制器:

    如果你的控制器是一个服务(我猜已经是了),Symfony将使用setter注入将容器注入到你的控制器中。

    代码将如下所示:

    <?php
    
    use Symfony\Contracts\Service\ServiceSubscriberInterface;
    
    
    class ParentController implement ServiceSubscriberInterface {
        protected ContainerInterface $container;
        public function setContainer(ContainerInterface) { $this->container = $container; } 
    
        public static function getSubscribedServices() {
             // 这是静态的,所以Symfony可以在不实例化控制器的情况下“看到”所需的服务。
             // 在这里定义一些常见的服务,一个示例在Symfony的AbstractController中
        }
    }
    
    class ChildController extends ParentController {
        // 使用自定义DI来为子控制器提供服务。
    
        public function indexAction {
            // 你可以使用$this->container->get(...)来获取服务
        }
    
    }

    Antwort
    0
  • StornierenAntwort