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