Symfony 5.4自动装配数组参数报错,寻求显式配置解决方案
解决Symfony 5.4中CollectionQueryFactory自动装配报错问题
问题重现
报错信息:
Cannot autowire service "App\Core\Shared\Query\CollectionQueryFactory": argument "$collectionOptions" of method "__construct()" is type-hinted "array", you should configure its value explicitly.
相关代码:
class CollectionQueryFactory implements CollectionQueryFactoryInterface { private array $collectionOptions; public function __construct(array $collectionOptions) { $this->collectionOptions = $collectionOptions; } ... }
已配置的services.yaml片段:
App\Core\Shared\Query\CollectionQueryFactory: arguments: $collectionOptions: '%api_platform.collection.pagination%'
排查与解决步骤
1. 检查YAML配置缩进
YAML对缩进规则极其敏感,确保你的配置完全嵌套在services:根节点下,且层级缩进统一:
services: # 其他服务配置... App\Core\Shared\Query\CollectionQueryFactory: arguments: $collectionOptions: '%api_platform.collection.pagination%'
注意arguments需比服务名称多缩进2个空格(或1个制表符,保持全局缩进风格一致),否则DI容器会忽略该配置。
2. 验证目标参数的类型
确保%api_platform.collection.pagination%是数组类型的参数:
- 如果参数定义在
parameters.yaml中,需按数组格式配置:parameters: api_platform.collection.pagination: items_per_page: 20 enabled: true page_parameter_name: 'page' - 若该参数是字符串格式(比如
api_platform.collection.pagination: 'items_per_page=20'),传入后会因类型不匹配触发报错。
3. 避免自动扫描覆盖自定义配置
如果你的services.yaml中存在针对App\Core\Shared\Query命名空间的自动扫描规则,需确保单独配置的服务不会被自动配置覆盖:
- 方案一:排除目标类的自动扫描
services: App\Core\Shared\Query\: resource: '../src/Core/Shared/Query/*' exclude: '../src/Core/Shared/Query/CollectionQueryFactory.php' - 方案二:在自动扫描中全局绑定参数
services: App\Core\Shared\Query\: resource: '../src/Core/Shared/Query/*' bind: $collectionOptions: '%api_platform.collection.pagination%'
4. 清除Symfony缓存
执行缓存清除命令,确保新配置生效:
# 开发环境 php bin/console cache:clear # 生产环境 php bin/console cache:clear --env=prod
内容的提问来源于stack exchange,提问作者Filip Stojavonic
相关产品推荐
相关产品推荐

