Symfony中Doctrine Migrations配置的%kernel.project_dir%未插值问题
Doctrine Migrations配置中%kernel.project_dir%变量未被解析的问题
环境信息
- 项目部署于Docker容器,目录映射配置完成
- 使用Symfony 5.1框架,已重写
Kernel::getProjectDir()方法 - 核心依赖版本:
{ "doctrine/doctrine-bundle": "^2.1", "doctrine/doctrine-migrations-bundle": "^3.2", "doctrine/orm": "^2.7", "symfony/framework-bundle": "5.1.*" }
问题描述
项目需配置两个数据库的迁移,其中一个迁移配置文件路径为容器内/opt/app/config/packages/migrations/some_config.yaml,在该配置中使用%kernel.project_dir%变量指定迁移模板路径时无效,替换为绝对路径则正常工作。
执行迁移生成命令:
bin/console doctrine:migrations:generate --configuration='/opt/app/config/packages/migrations/some_config.yaml'
抛出异常:
The specified template "%kernel.project_dir%/config/migration_template.txt" cannot be found or is not readable
调试确认%kernel.project_dir%变量未被解析为实际路径。
解决方案
原因
通过--configuration参数直接指定独立配置文件时,Doctrine Migrations Bundle不会触发Symfony的容器参数解析流程,导致框架自带的参数无法被替换。
解决方法
1. 整合配置到Symfony主配置文件
将多数据库迁移配置写入config/packages/doctrine_migrations.yaml,利用Symfony自身的参数解析能力自动处理%kernel.project_dir%:
doctrine_migrations: # 默认数据库配置 migrations_paths: 'App\Migrations\DefaultDb': '%kernel.project_dir%/migrations/DefaultDb' template: '%kernel.project_dir%/config/migration_template.txt' # 第二个数据库的配置节点 some_db: migrations_paths: 'App\Migrations\SomeDb': '%kernel.project_dir%/migrations/SomeDb' template: '%kernel.project_dir%/config/migration_template.txt' connection: some_db
执行命令时通过配置节点名称指定:
bin/console doctrine:migrations:generate --configuration=some_db
2. 使用相对路径替代变量
若必须保留独立配置文件,可基于配置文件所在路径使用相对路径:
# /opt/app/config/packages/migrations/some_config.yaml migrations_paths: 'App\Migrations\SomeDb': '../../migrations/SomeDb' template: '../../config/migration_template.txt'
3. 通过环境变量传递路径
在Docker容器中设置环境变量PROJECT_DIR=/opt/app,并在配置文件中引用:
template: '%env(PROJECT_DIR)%/config/migration_template.txt'
同时在项目.env文件中添加PROJECT_DIR=%kernel.project_dir%,确保Symfony容器能正确解析。
内容的提问来源于stack exchange,提问作者Gregory Sysoev
相关产品推荐
相关产品推荐

