Symfony的魔术:依赖注入
#初学者 #编程 #php #symfony

注射依赖性是一种基本原则,包括各种方法,包括固体。

更务实地,而不是这样做:

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简化了该过程并在场景后面进行了主要的优化,因此您在尊重标准的同时免费获得此功能(在表演方面)。