使用Solarium(NelmioSolariumBundle)对接Solr遇服务找不到问题求助
解决Symfony中Solarium服务"solarium.client"找不到的问题
这个问题很典型——Symfony的AbstractController为了性能优化,默认只注入了一组核心服务(就是错误提示里列的那些),像solarium.client这种第三方Bundle提供的服务不在默认范围内,所以用$this->get()肯定拿不到。咱们直接用Symfony推荐的依赖注入就能搞定,下面给两种常用方案:
方案1:构造函数注入(推荐)
这是Symfony官方最推荐的方式,能让控制器的依赖关系一目了然,也方便后续测试。修改你的控制器代码如下:
<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; use Solarium\Client; // 别忘了导入Solarium的Client类 // 类名首字母大写,符合PSR命名规范 class SolariumController extends AbstractController { private $solariumClient; // 通过构造函数注入Solarium客户端服务 public function __construct(Client $solariumClient) { $this->solariumClient = $solariumClient; } /** * @Route("/solariums", name="solariums") */ public function solariumSearch() { $select = $this->solariumClient->createSelect(); $select->setQuery('brandon'); $results = $this->solariumClient->select($select); // 注意这里的render参数,你原来的['$results']写法错误,要改成键值对 return $this->render('pages/solarium.html.twig', ['results' => $results]); } }
方案2:方法注入(适合仅单个方法用到服务的场景)
如果这个Solarium服务只在这一个方法里用,也可以用#[Autowire]属性直接在方法参数里注入,更简洁:
<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; use Solarium\Client; use Symfony\Component\DependencyInjection\Attribute\Autowire; class SolariumController extends AbstractController { /** * @Route("/solariums", name="solariums") */ public function solariumSearch(#[Autowire] Client $solariumClient) { $select = $solariumClient->createSelect(); $select->setQuery('brandon'); $results = $solariumClient->select($select); return $this->render('pages/solarium.html.twig', ['results' => $results]); } }
额外检查项
- 确认NelmioSolariumBundle已经正确配置:
检查config/packages/nelmio_solarium.yaml里的配置是否正确,比如:nelmio_solarium: endpoints: default: dsn: 'http://localhost:8983/solr' # 替换成你的Solr地址 - 验证服务是否存在:
执行命令php bin/console debug:container solarium.client,如果能看到服务信息,说明服务已经成功注册,注入肯定没问题。 - 修正Twig参数:
你原来的['$results']是错误的,Twig需要键值对形式的参数,这样在模板里才能通过{{ results }}访问查询结果。
内容的提问来源于stack exchange,提问作者Brandys
相关产品推荐
相关产品推荐

