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