Injection de dépendance du contrôleur parent Symfony 6 vers le contrôleur enfant
P粉208469050
2023-08-17 20:19:03
<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>
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 :