Injection de dépendance du contrôleur parent Symfony 6 vers le contrôleur enfant
P粉208469050
P粉208469050 2023-08-17 20:19:03
0
1
607
<p>J'ai une classe de contrôleur de base qui contient des méthodes utilitaires que tous les contrôleurs enfants utilisent. Actuellement, il dispose de 3 dépendances, mais il pourrait y en avoir davantage à l'avenir. Ainsi, chaque fois que je souhaite ajouter une dépendance à un contrôleur enfant, j'ai maintenant un problème où je pense qu'il y a trop de directives pour l'injection de dépendances. </p> <pre class="brush:php;toolbar:false;">la classe abstraite BaseController étend AbstractController { fonction publique __construct( protégé en lecture seule SerializerInterface $serializer, protégé en lecture seule ValidatorInterface $validator, privé en lecture seule ResponseGenerator $responseGenerator, ) { } ... } la classe ChildController étend BaseController { // Toutes les injections de classe parent sont requises dans toutes les classes enfants. fonction publique __construct( SerializerInterface $sérialiseur, ValidateurInterface $validateur, ResponseGenerator $responseGenerator, privé en lecture seule SomeRepository $someRepository, ... insérez ici toutes les autres dépendances spécifiques au contrôleur enfant. ) { parent::__construct($serializer, $validator, $responseGenerator); } ... }</pré> <p>J'ai essayé d'utiliser <code>$this->container->get('serializer')</code> dans le contrôleur de base, mais cela n'a pas fonctionné car <code>AbstractController: : $container</code> est défini par injection, mais n'a pas de constructeur, donc <code>parent::__construct()</code> De plus, cela ne me donne pas <code>validator</code>, donc même si cela fonctionne, cela ne résout qu'une partie du problème. </p> <p>J'ai essayé de rechercher des propriétés que je pourrais utiliser, comme </p> <pre class="brush:php;toolbar:false;">la classe abstraite BaseController étend AbstractController { #[Injecter] protégé en lecture seule SerializerInterface $serializer ; #[Injecter] protégé en lecture seule ValidatorInterface $validator;</pre> <p>Mais rien de similaire n'a été trouvé (PHP-DI l'a, mais pas Symfony). </p> <p>Existe-t-il un moyen d’éliminer d’une manière ou d’une autre les dépendances en double dans les contrôleurs enfants ? </p>
P粉208469050
P粉208469050

répondre à tous(1)
P粉464208937

Ce dont vous avez besoin, c'est d'être appelé abonné au service

Dans Symfony, lorsque les contrôleurs héritent de AbstractController, ils sont abonnés au service, ce qui signifie qu'ils sont injectés dans un petit conteneur qui contient certains services communs (comme twig, sérialiseurs, générateurs de formulaires, etc.).

Si vous souhaitez certains services "communs" que vos contrôleurs enfants utiliseront, vous pouvez étendre la liste en les remplaçant getSubscribedServices()dans le contrôleur parent. Ou si votre contrôleur n'hérite pas du contrôleur par défaut fourni par Symfony, il vous suffit d'implémenter votre propre contrôleur :

Si votre contrôleur est un service (je suppose que c'est déjà le cas), Symfony utilisera l'injection setter pour injecter le conteneur dans votre contrôleur.

Le code ressemblera à ceci :

<?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(...)来获取服务
    }

}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal