Symfony 4升级后Doctrine无法识别sqlsrv驱动问题求助
结合你描述的症状——明明配置了SQL Server驱动却触发MySQL相关报错,还发现Web应用加载了默认配置,我整理了几个实际项目里验证过的排查和解决步骤:
1. 优先检查环境变量里的DATABASE_URL
Symfony 4中Doctrine会优先读取DATABASE_URL环境变量来配置数据库连接,哪怕你在doctrine.yaml里明确写了sqlsrv驱动,只要.env或.env.dev里的DATABASE_URL还是mysql://开头的格式,就会直接覆盖成MySQL驱动。
你需要把它改成SQL Server的格式:
DATABASE_URL="sqlsrv://你的用户名:你的密码@数据库主机:端口/数据库名"
2. 确认doctrine.yaml的配置正确性
检查config/packages/doctrine.yaml(dev环境额外检查config/packages/dev/doctrine.yaml)里的DBAL配置,确保驱动是pdo_sqlsrv,且配置逻辑没有冲突:
doctrine: dbal: driver: 'pdo_sqlsrv' url: '%env(resolve:DATABASE_URL)%' # 也可以手动配置(二选一即可,推荐用url方式统一管理) # host: '%env(DATABASE_HOST)%' # port: '%env(DATABASE_PORT)%' # dbname: '%env(DATABASE_NAME)%' # user: '%env(DATABASE_USER)%' # password: '%env(DATABASE_PASSWORD)%' charset: UTF-8
3. 强制清除Symfony缓存
Symfony的缓存机制偶尔会保留旧配置,哪怕你修改了配置文件也不会立即生效。执行命令清除dev环境的缓存:
php bin/console cache:clear --env=dev
4. 验证CLI与Web环境的PHP配置一致性
Web端phpinfo()显示驱动已安装,但CLI命令行可能使用了另一个php.ini文件,导致驱动未加载。执行以下命令查看CLI环境的已安装扩展:
php -m
检查输出里是否有pdo_sqlsrv和sqlsrv两个扩展。如果没有,需要找到CLI对应的php.ini文件添加驱动配置,或者确保CLI使用的是和Web端相同的PHP版本。
5. 确认配置是否被正确加载
执行命令查看当前dev环境下Doctrine的实际生效配置:
php bin/console debug:config doctrine --env=dev
在输出里定位dbal.driver项,确认它的值是pdo_sqlsrv。如果还是pdo_mysql,说明存在其他优先级更高的配置文件在覆盖你的设置,比如第三方Bundle的配置,或者config/packages目录下的其他Doctrine相关配置。
按照这些步骤排查,基本能解决驱动不生效的问题。
内容的提问来源于stack exchange,提问作者rmsluimers

