在 Symfony 2.8 中将服务注入控制器?

Inject service into controller in Symfony 2.8?

我真的很难尝试将服务注入控制器,我发现了一些 post,这就是我尝试过的:

我有一个名为 FormatService 的服务

services:
    formats_service:
            class: FormatsBundle\Services\FormatService

我希望将它注入 FormatsController,所以我尝试了 Defining Controllers as Services,然后按照文档所述更改了我的整个路由

app.formats_controller:
        class: ABundle\Controller\FormatsController
        arguments: ["@formats_service"]

这样做会在我尝试访问时出现 Error: Call to a member function has() on null 错误 我控制的任何端点

然后我试着从容器中收集它,做这样的事情

public function __construct () {
  $this->formatService = $this->container->get('formats_service');
}

这给了我一个错误,$this->container 似乎是空的。

我做了一项研究,发现 将容器注入我的控制器,但解决方案与我从第一点开始无法完成的事情相同,我无法注入服务,因为这样做我需要将我的控制器定义为服务,但这样做会在我尝试从我的控制器访问任何端点时 Error: Call to a member function has() on null

在 Symfony 2.8 中,有没有什么方法可以将服务注入到控制器中而不造成一团糟?

当您使用控制器时,您无需将其声明为服务,因为控制器具有 容器,您可以使用 php app/console debug:container 查看您的服务是否在您的容器中,您可以直接将其用于您的操作

public function newAction()

{

// the container will instantiate a new FormatService()
$myService = $this->container->get('formats_service');

}

你可以在这里看到更多https://symfony.com/doc/2.8/service_container.html

将控制器定义为服务时,您必须直接注入服务而不访问容器。当您的控制器扩展 Symfony 的基本控制器时,您可以采用混合方法,但通常不鼓励这样做。

如果您修改控制器的构造函数,它应该可以工作:

public function __construct(FormatsBundle\Services\FormatService $formatService) 
{
    $this->formatService = $formatService;
}

编辑:如果你想在你的控制器中使用容器,你应该扩展 Symfony\Bundle\FrameworkBundle\Controller\Controller 或添加 use Symfony\Component\DependencyInjection\ContainerAwareTrait,但是在将控制器作为服务使用时同样不鼓励两者,因为那样你可以也可以编写一个常规控制器。