Symfony中如何为同一服务配置不同别名?多Elasticsearch索引查询问题
解决FOSElasticaBundle多索引下的Finder注入问题
你当前的问题是因为全局把TransformedFinder类别名指向了fos_elastica.finder.articles,导致所有Autowire该类的地方都只会拿到articles索引的Finder。针对多索引场景,有几种简洁的解决方式:
方式一:通过参数名绑定不同的Finder(推荐,Autowire友好)
在services.yaml里为每个索引的Finder创建带参数名的别名,Autowire会根据参数名自动匹配对应的服务:
# api/config/services.yaml services: # ... 其他配置 # 绑定articles索引的Finder到$articleFinder参数 FOS\ElasticaBundle\Finder\TransformedFinder $articleFinder: alias: fos_elastica.finder.articles # 绑定fdocentetes索引的Finder到$fdocenteteFinder参数 FOS\ElasticaBundle\Finder\TransformedFinder $fdocenteteFinder: alias: fos_elastica.finder.fdocentetes
然后修改服务类,使用对应的参数名:
FArticleService
<?php namespace App\Service; use FOS\ElasticaBundle\Finder\TransformedFinder; class FArticleService { public function __construct( private readonly TransformedFinder $articleFinder, ) { } public function query(array $query, int $page, int $size) { $results = $this->articleFinder->createRawPaginatorAdapter($query)->getResults(($page * $size) - $size, $size); } }
FDocenteteService
<?php namespace App\Service; use FOS\ElasticaBundle\Finder\TransformedFinder; class FDocenteteService { public function __construct( private readonly TransformedFinder $fdocenteteFinder, ) { } public function query(array $query, int $page, int $size) { $results = $this->fdocenteteFinder->createRawPaginatorAdapter($query)->getResults(($page * $size) - $size, $size); } }
方式二:显式配置服务参数(无需修改参数名)
如果不想改服务类的参数名,可以直接在services.yaml里为每个服务指定要注入的Finder:
# api/config/services.yaml services: # ... 其他配置 App\Service\FArticleService: arguments: $finder: '@fos_elastica.finder.articles' App\Service\FDocenteteService: arguments: $finder: '@fos_elastica.finder.fdocentetes'
服务类可保持原构造函数不变,框架会自动注入对应的Finder实例。
方式三:利用实体类绑定Finder(贴合ORM场景)
FOSElasticaBundle的Finder与实体类绑定,你也可以通过实体类型注入对应Finder。先在services.yaml添加绑定:
# api/config/services.yaml services: _defaults: autowire: true autoconfigure: true # 为FDocentete实体绑定对应的Finder FOS\ElasticaBundle\Finder\FinderInterface $fdocenteteFinder: alias: fos_elastica.finder.fdocentetes # 为FArticleProp实体绑定对应的Finder FOS\ElasticaBundle\Finder\FinderInterface $articleFinder: alias: fos_elastica.finder.articles
然后在服务类里用FinderInterface做类型提示(更灵活):
<?php namespace App\Service; use FOS\ElasticaBundle\Finder\FinderInterface; class FDocenteteService { public function __construct( private readonly FinderInterface $fdocenteteFinder, ) { } // ... 业务方法 }
内容的提问来源于stack exchange,提问作者Lenny4
相关产品推荐
相关产品推荐

