tourze / symfony-dependency-service-loader
Installs: 7 960
Dependents: 265
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/tourze/symfony-dependency-service-loader
Requires
- composer-runtime-api: ^2.0
- symfony/config: ^7.3
- symfony/dependency-injection: ^7.3
- symfony/polyfill-php85: ^1.31
- symfony/yaml: ^7.3
Requires (Dev)
- phpstan/phpstan: ^2.1
- phpunit/phpunit: ^11.5
- tourze/phpunit-base: 1.*
This package is auto-updated.
Last update: 2025-11-14 14:32:40 UTC
README
这个包为 Symfony Dependency Injection 组件提供了 AutoExtension 基类,用于自动加载服务配置。
特性
- 自动加载服务配置:自动加载指定目录下的 YAML 服务配置文件
- 环境特定配置:根据
kernel.environment自动加载对应环境的服务配置 - 严格的文件验证:限制配置目录中允许的文件名,避免错误配置
- 最佳实践强制:强制要求使用
_defaults配置,提高代码质量 - 禁用 exclude:禁止使用
exclude配置,鼓励明确的服务定义 - 智能配置合并:自动合并基础配置和环境特定配置
- 环境感知:根据
kernel.environment参数动态加载配置 - Doctrine 集成:通过
AppendDoctrineConnectionExtension支持 Doctrine 连接配置
安装
composer require tourze/symfony-dependency-service-loader
使用方法
使用 AutoExtension
继承 AutoExtension 类:
<?php namespace App\DependencyInjection; use Tourze\SymfonyDependencyServiceLoader\AutoExtension; class MyBundleExtension extends AutoExtension { /** * 返回配置文件目录路径 */ protected function getConfigDir(): string { return __DIR__ . '/../Resources/config'; } }
配置文件结构
支持以下配置文件结构:
Resources/config/
├── services.yaml # 基础服务配置
├── services_dev.yaml # 开发环境服务配置
└── services_test.yaml # 测试环境服务配置
services.yaml(基础配置)
services: _defaults: autowire: true autoconfigure: true App\Service\: resource: '../src/App/Service/'
services_dev.yaml(开发环境)
services: _defaults: autowire: true autoconfigure: true # 开发环境特定的服务 App\Dev\Service\: resource: '../src/App/Dev/Service/'
services_test.yaml(测试环境)
services: _defaults: autowire: true autoconfigure: true # 测试环境特定的服务 App\Test\Service\: resource: '../src/App/Test/Service/'
使用 Doctrine 连接扩展
如果你的 Bundle 需要 Doctrine 连接配置,可以使用 AppendDoctrineConnectionExtension:
<?php namespace App\DependencyInjection; use Tourze\SymfonyDependencyServiceLoader\AppendDoctrineConnectionExtension; class MyDoctrineBundleExtension extends AppendDoctrineConnectionExtension { protected function getConfigDir(): string { return __DIR__ . '/../Resources/config'; } /** * 返回 Doctrine 连接名称 */ protected function getDoctrineConnectionName(): string { return 'my_connection'; } }
此扩展会:
- 复制现有的 Doctrine DBAL 配置
- 自动配置连接参数
- 启用 profiling 收集回溯信息
- 移除
use_savepoints配置
配置规则
允许的文件
只允许以下配置文件:
services.yamlservices_dev.yamlservices_test.yaml
其他 YAML 文件会触发 InvalidYamlConfigurationException 异常
配置要求
- 必须包含
_defaults:所有配置文件必须包含services._defaults配置 - 禁止使用
exclude:服务配置中禁止使用exclude配置 - 必须包含
services键:配置必须包含services顶级键
示例配置
❌ 错误配置(缺少 _defaults):
services: App\Service\MyService: class: App\Service\MyService
❌ 错误配置(使用 exclude):
services: _defaults: autowire: true autoconfigure: true App\Service\: resource: '../src/App/Service/' exclude: - '../src/App/Service/Deprecated/'
✅ 正确配置:
services: _defaults: autowire: true autoconfigure: true App\Service\MyService: class: App\Service\MyService
异常
可能抛出的异常:
InvalidYamlConfigurationException:当 YAML 配置格式或内容不符合要求时
Bundle 目录结构示例
MyBundle/
├── DependencyInjection/
│ └── MyBundleExtension.php
└── Resources/
└── config/
├── services.yaml
├── services_dev.yaml
└── services_test.yaml
环境配置加载逻辑
- 开发环境 (dev):加载
services.yaml+services_dev.yaml - 测试环境 (test):加载
services.yaml+services_test.yaml - 生产环境 (prod):仅加载
services.yaml
最佳实践
- 明确配置:避免使用
exclude,明确定义每个服务 - 环境分离:将环境特定的服务放在对应的配置文件中
- 统一标准:所有配置文件都应包含
_defaults配置 - 配置验证:该扩展会自动验证配置文件的完整性和正确性
系统要求
- PHP 8.1+
- Symfony 7.3+
- Symfony Config 7.3+
- Symfony DependencyInjection 7.3+
- Symfony Yaml 7.3+
许可证
MIT License
作者
- tourze 创始作者