Maison > Questions et réponses > le corps du texte
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(...)来获取服务 } }