Symfony多数据库连接异常:查询第二连接仍用默认库报错
问题原因
你直接通过Connection类型注入时,Symfony默认会注入配置中指定的默认连接(npreports),而非你期望的npfactory连接。依赖注入容器不会自动识别参数名$npfactory对应哪个连接,必须明确指定要注入的服务实例。
解决方案
方式1:使用属性注解指定注入的连接服务
在构造函数参数上添加#[Autowire]注解,明确指定npfactory连接的服务ID:
use Doctrine\DBAL\Connection; use Symfony\Component\DependencyInjection\Attribute\Autowire; class YourRepositoryOrController { private Connection $npfactory; public function __construct( #[Autowire(service: 'doctrine.dbal.npfactory_connection')] Connection $npfactory ) { $this->npfactory = $npfactory; } // 示例查询 public function getScheduledTasks() { // 此时会使用npfactory连接执行查询 return $this->npfactory->fetchAllAssociative('SELECT * FROM scheduled_tasks'); } }
方式2:在services.yaml中全局绑定参数
如果多个类都需要注入npfactory连接,可以在config/services.yaml中配置参数绑定,避免重复写注解:
services: _defaults: autowire: true autoconfigure: true # 绑定$npfactory参数到指定的连接服务 bind: $npfactory: '@doctrine.dbal.npfactory_connection'
之后你原来的构造函数写法就能正常注入npfactory连接了。
验证步骤
可以在查询前打印当前连接的数据库名,确认是否使用了正确的连接:
// 输出当前连接的数据库名称,应该显示npfactory对应的库名 echo $this->npfactory->getDatabase();
补充:ORM实体管理器多连接配置(如果使用ORM)
如果后续需要为特定实体使用npfactory连接,需在doctrine.yaml中配置对应的实体管理器:
doctrine: dbal: default_connection: npreports connections: npreports: url: '%env(resolve:DATABASE_REPORTS_URL)%' npfactory: url: '%env(resolve:DATABASE_FACTORY_URL)%' orm: default_entity_manager: npreports entity_managers: npreports: connection: npreports mappings: # 配置npreports库对应的实体映射,示例: App\Entity\Reports: is_bundle: false type: attribute dir: '%kernel.project_dir%/src/Entity/Reports' prefix: 'App\Entity\Reports' alias: Reports npfactory: connection: npfactory mappings: # 配置npfactory库对应的实体映射 App\Entity\Factory: is_bundle: false type: attribute dir: '%kernel.project_dir%/src/Entity/Factory' prefix: 'App\Entity\Factory' alias: Factory
注入实体管理器时同样需要指定服务ID:#[Autowire(service: 'doctrine.orm.npfactory_entity_manager')]
内容的提问来源于stack exchange,提问作者Juergen Schulze
相关产品推荐
相关产品推荐

