注射依赖性是一种基本原则,包括各种方法,包括固体。
更务实地,而不是这样做:
namespace App\Services;
class MyService {
private $myDependency;
public function __construct()
{
$this->myDependency = new MyDependency();
}
}
您可以做到这一点(php 8):
namespace App\Services;
class MyService {
public function __construct(private MyDependency $myDependency)
{}
}
但是,您可能会想知道为什么它更好以及如何在现场工作。
注射和自动发射
在独立的PHP项目中,您需要创建一些将具有 single 但非常重要的责任的类:读取配置和实例化对象。
多亏了这堂课,您将能够使用我们之前看到的快捷方式。
在Symfony中,通常是通过内置的界面和容器(例如ContainerBuilder
,依赖注入部分)来实现的,从而节省了大量的时间和努力。
阅读“服务容器”一词并不少见。 Symfony查看配置文件夹以构建其容器。这就是为什么您必须在特定的配置文件中写入。
Symfony在场景后面有很多魔术,提供喜欢自动启动的功能。
通过启用自动功能,您告诉Symfony自动注入服务中的依赖性:
# config/services.yaml
services:
_defaults:
autowire: true
App\:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Tests,Kernel.php}'
Source: Symfony doc - Autowiring
它可以防止手动声明,并且类“自动注册为服务并配置为自动启用。”
通过这种方式,您可以自动加载依赖项 并将其在控制器中使用。
对表演有什么影响?
在现场,Symfony使several optimizations在这里看不到,包括缓存和增强汇编。
这就是为什么“使用自动性没有性能罚款”,除了在内核可能会多次重建容器的开发环境中。
现成的容器
由Symfony提供支持的应用不必打扰。这些容器几乎包含所需的所有服务。
他们只需要将它们作为参数键入即可开始使用它们。
例如,如果您需要日志:
namespace App\Service;
use Psr\Log\LoggerInterface;
class MyClass
{
public function __construct(
private LoggerInterface $logger,
) {
}
}
Source: Symfony docs - service config into a service
您现在甚至可以指定是否应根据PHP 8属性根据环境注册服务:
#[When(env: 'dev')]
class MyClass
{
}
包起来
没有最终的方法,但是依赖注入比手动耦合要好得多。
Symfony简化了该过程并在场景后面进行了主要的优化,因此您在尊重标准的同时免费获得此功能(在表演方面)。