跳到内容

如何导入配置文件/资源

编辑此页

提示

在本节中,服务配置文件被称为资源。虽然大多数配置资源是文件(例如 YAML、XML、PHP),但 Symfony 能够从任何地方加载配置(例如数据库,甚至通过外部 Web 服务)。

服务容器是使用单个配置资源构建的(默认情况下为 config/services.yaml)。这使您可以完全灵活地控制应用程序中的服务。

外部服务配置可以通过两种不同的方式导入。第一种方法通常用于导入其他资源,是通过 imports 指令。第二种方法,使用依赖注入扩展,被第三方扩展包用于加载配置。请继续阅读以了解有关这两种方法的更多信息。

使用 imports 导入配置

默认情况下,服务配置位于 config/services.yaml 中。但是,如果该文件变得很大,您可以随意将其组织到多个文件中。假设您决定将一些配置移动到一个新文件

1
2
3
4
5
6
# config/services/mailer.yaml
parameters:
    # ... some parameters

services:
    # ... some services

要导入此文件,请使用任何其他文件中的 imports 键,并传递导入文件的相对或绝对路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# config/services.yaml
imports:
    - { resource: services/mailer.yaml }
    # If you want to import a whole directory:
    - { resource: services/ }
services:
    _defaults:
        autowire: true
        autoconfigure: true

    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

    # ...

加载配置文件时,Symfony 首先加载导入的文件,然后处理文件中定义的参数和服务。如果您像上面的示例一样使用 默认的 services.yaml 配置,则 App\ 定义会为在 ../src/* 中找到的类创建服务。如果您的导入文件也为这些类定义了服务,它们将被覆盖。

对此的一种可能的解决方案是将导入文件的类和/或目录添加到 App\ 定义的 exclude 选项中。另一种解决方案是不使用导入,而是在同一文件中,但在 App\ 定义之后添加服务定义以覆盖它。

注意

由于参数的解析方式,您不能使用它们来动态构建导入中的路径。这意味着以下操作不起作用:

1
2
3
# config/services.yaml
imports:
    - { resource: '%kernel.project_dir%/somefile.yaml' }

通过容器扩展导入配置

第三方扩展包容器配置,包括 Symfony 核心服务,通常使用另一种方法加载:容器扩展

在内部,每个扩展包都在您目前看到的类似文件中定义其服务。但是,这些文件不是使用 import 指令导入的。相反,扩展包使用依赖注入扩展来自动加载文件。一旦您启用一个扩展包,它的扩展就会被调用,这能够加载服务配置文件。

实际上,config/packages/ 中的每个配置文件都传递给其相关扩展包的扩展 - 例如 FrameworkBundleTwigBundle - 并用于进一步配置这些服务。

本作品,包括代码示例,根据 Creative Commons BY-SA 3.0 许可获得许可。
目录
    版本