tarasovich / symfony-yaml-merge-loader
在services.yaml中合并导入的可能
v1.0.0
2022-07-05 10:54 UTC
Requires
- php: ^7.4 || ^8.0
- symfony/config: ^5.0 || ^6.0
- symfony/dependency-injection: ^5.0 || ^6.0
README
这是对 Symfony\Component\DependencyInjection\Loader\YamlFileLoader 的扩展,增加了在 services.yaml 中合并导入的功能
# config/services.yaml imports: - { resource: 'services/*.yaml', merge: true }
复杂性
当加载配置文件时,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.yaml
的App\
定义覆盖。