doctrine - Symfony4:如何使用 dotenv 和多个实体管理器切换实体?
问题描述
如何通过 dotenv 选择具有相同实体名称的不同实体路径。
最初,我们在 Symfony 3 中申请了关于我们组织活动的人员会议。然后我们决定将此应用程序提供给我们的合作伙伴。
其中一位合作伙伴要求我们使用他们的数据和规范为他们定制应用程序。我们基本上创建了一个新的 Symfony 应用程序实例,其中包含数据库表的副本(具有不同的前缀)、实体的更改以反映新的数据库表名称,以及一些翻译文本的更改。
似乎其他合作伙伴会跟随这种定制实例的趋势。
因此,我正在尝试将核心应用程序更新到 Symfony 4,并且我正在尝试使用多个实体管理器和 dotenv 来区分合作伙伴数据库表,如下所述。
简而言之,我正在尝试使用多个实体管理器通过前缀切换数据库表名。
.env
###> doctrine/doctrine-bundle ###
# Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
# For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db"
# Configure your db driver and server_version in config/packages/doctrine.yaml
DATABASE_URL=oci8://user:pass@127.0.0.1:1521/XE
EM_TYPE=OpenAccess
###< doctrine/doctrine-bundle ###
仅在 security.yaml 工作环境良好
security:
encoders:
App\Entity\%env(EM_TYPE)%\Osoba:
providers:
our_db_provider:
entity:
class: App\Entity\%env(EM_TYPE)%\Osoba
property: username
当我尝试在 default_entity_manager 中获取 %env(EM_TYPE)% 时,出现错误You have requested a non-existent service "doctrine.orm.%env(EM_TYPE)%_entity_manager"。 教义.yaml
parameters:
env(DATABASE_URL): ''
doctrine:
dbal:
default_connection: '%env(EM_TYPE)%'
connections:
MeetingTool:
driver: 'oci8'
charset: UTF8
schema_filter: /^MT_/
url: '%env(resolve:DATABASE_URL)%'
OpenAccess:
driver: 'oci8'
charset: UTF8
schema_filter: /^OA6_/
url: '%env(resolve:DATABASE_URL)%'
orm:
auto_generate_proxy_classes: true
default_entity_manager: '%env(EM_TYPE)%'
entity_managers:
MeetingTool:
connection: MeetingTool
mappings:
Main:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity/MeetingTool'
prefix: 'App\Entity\MeetingTool'
alias: App2
OpenAccess:
connection: OpenAccess
mappings:
App:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity/OpenAccess'
prefix: 'App\Entity\OpenAccess'
alias: OpenAccess
最大的问题是使用,我如何在这里定位正确的实体?例如 loginController.php
<?php
namespace App\Controller;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\OpenAccess\LogPrihlaseni;
//use App\Entity\MeetingTool\LogPrihlaseni;
class LoginController extends AbstractController {
private $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
public function logPrihlaseni() {
$log = new LogPrihlaseni();
解决方案
推荐阅读
- javascript - Tcomb-form-native:如何动态向表单添加新选项
- python - 使用 shift 侧翼数据
- php - 在php中用新对象初始化数组是否可以/可以
- python - 尝试将 R 对象文件加载到 python numpy 数组中时出现内存错误
- c - 使用数组和 strcat 将字符附加到字符串
- javascript - 在提供的 Ext.window.Window 中设置禁止编辑字段
- javascript - 在单选按钮悬停时显示 div
- azure - 在开发测试实验室中从取消配置的 Linux VM 映像创建 VM 时出现 DNS 问题
- powershell - 优化代码以在word文档中搜索多个关键字
- html - 水平下拉菜单未在一行中显示两个单词