tarasovich/symfony-yaml-merge-loader

在services.yaml中合并导入的可能

v1.0.0 2022-07-05 10:54 UTC

This package is auto-updated.

Last update: 2024-09-05 15:32:11 UTC


README

这是对 Symfony\Component\DependencyInjection\Loader\YamlFileLoader 的扩展,增加了在 services.yaml 中合并导入的功能

# config/services.yaml
imports:
- { resource: 'services/*.yaml', merge: true }

复杂性

来自官方symfony文档

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

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

使用此扩展,你不需要从 App\ 定义中排除导入的服务。

安装

使用composer获取扩展

通过在Symfony项目的根目录下运行此命令添加YamlFileMergeLoader

composer require tarasovich/symfony-yaml-merge-loader

替换默认加载器

// src/Kernel.php (your kernel class may be defined in a different class/path)
namespace App;

use Symfony\Component\HttpKernel\Kernel as BaseKernel;
use Tarasovich\YamlFileMergeLoader;
// ...

class Kernel extends BaseKernel
{
    protected function getContainerLoader(ContainerInterface $container): LoaderInterface
    {
        /** @var ContainerBuilder $container */
        return YamlFileMergeLoader::replaceOriginalLoader(
            $container,
            parent::getContainerLoader($container),
            $this->getEnvironment()
        );
    }
}

组织导入文件

将一些服务和/或参数定义移动到其他文件中,例如

# config/services/hello_word.yaml
parameters:
  app.hello_word.text: 'Hello World!'

services:
  _defaults:
    autowire: true
    autoconfigure: true

  App\Service\HelloWordService:
    arguments:
      $defaultText: '%app.hello_word.text%'

使用merge: true选项将资源导入到services.yaml中。

# config/services.yaml
imports:
- { resource: 'services/*.yaml', merge: true }

services:
  _defaults:
    autowire: true
    autoconfigure: true

  App\:
    resource: '../src/'
    exclude:
      - '../src/DependencyInjection/'
      - '../src/Entity/'
      - '../src/Kernel.php'
      - '../src/Tests/'

就是这样!

现在,你的App\Service\HelloWordService不会被来自config/services.yamlApp\定义覆盖。