能否在Symfony的services.yaml中动态获取服务类名配置?
Symfony服务配置:批量为子类配置工厂并动态传入自身类名
可以通过Symfony的表达式语言实现这个需求,完全在配置层面解决,无需修改工厂或子类代码。
最终配置示例
# config/services.yaml Domain\Children\: resource: '../domain/children/*' factory: ['Domain\Factory', 'getChild'] # 用表达式动态获取当前服务对应的类名 arguments: ['@=service("service_container").getDefinition(serviceId).getClass()'] autowire: false autoconfigure: false
配置说明
@=前缀表示启用Symfony表达式语言,会动态计算参数值serviceId是当前批量配置中每个子类对应的服务ID(默认就是类的完全限定名)- 通过容器获取当前服务的定义,再提取出类名,作为参数传给工厂的
getChild方法
扩展:如果需要短类名
如果工厂方法需要的是不带命名空间的短类名,可修改表达式做字符串截取:
arguments: ['@=substr(service("service_container").getDefinition(serviceId).getClass(), strrpos(service("service_container").getDefinition(serviceId).getClass(), "\\") + 1)']
注意事项
- 确保
Domain\Factory已被正确注册为服务(如果它有依赖,可单独配置自动注入) - 关闭
autowire和autoconfigure,因为这些子类是通过工厂创建,不需要Symfony自动处理构造函数注入
内容的提问来源于stack exchange,提问作者Sleepwave
相关产品推荐
相关产品推荐

