Maison  >  Questions et réponses  >  le corps du texte

Injection de dépendance du contrôleur parent Symfony 6 vers le contrôleur enfant

<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粉208469050P粉208469050451 Il y a quelques jours530

répondre à tous(1)je répondrai

  • P粉464208937

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

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

    répondre
    0
  • Annulerrépondre