我最近被要求清理我们的遗留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
答案 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
环境会对性能产生一些影响。最重要的是,当您修改服务类时,您的容器可能会更频繁地重建。
资源: