在控制器类中加载服务

时间:2018-06-12 09:07:25

标签: symfony

我最近被要求清理我们的遗留symfony代码并检查在执行时是否也会获得性能。

我发现的第一件事是,几乎每个控制器都会通过

加载服务
 public function someAction(Request $request){

     $someService = $this->get(someService::class);
     ... there are plenty of them 

 }

我的问题:   改为在Controller构造函数中使用依赖注入会更好吗?

  public function __construct(SomeService1 $someService1, SomeService2 ...)

service.yml文件已启用autowire:true属性。  我以前做过一些关于SO的研究,但后来我更加困惑,并不确定哪一个是值得推荐的方法。

我的Symfony版本是3.3.17

1 个答案:

答案 0 :(得分:1)

如果您扩展基础AbstractController课程,则无法通过$this->container->get()$this->get()直接从容器访问服务。相反,您必须使用依赖注入来获取服务:最容易通过type-hinting action method arguments完成:

  

请勿使用$this->get()$this->container->get()从容器中获取服务。相反,使用依赖注入。

如果您需要控制器中的服务,只需使用其类(或接口)名称键入提示参数。 Symfony会自动为您提供所需的服务:

use Psr\Log\LoggerInterface;
// ...

/**
 * @Route("/lucky/number/{max}")
 */
public function number($max, LoggerInterface $logger)
{
    $logger->info('We are logging!');
    // ...
}

从3.3开始,控制器是单独导入的,以确保即使您不扩展任何基本控制器类,也可以将服务作为操作参数注入:

# services.yml
services:
    # ...

    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']

如果不直接从容器中获取服务,您可以将您的服务设为私有,其中包含several advantages

使用任何这些功能都没有运行时性能影响。但是,dev环境会对性能产生一些影响。最重要的是,当您修改服务类时,您的容器可能会更频繁地重建。

资源: