我的多租戶應用程序使用主數據庫,該主數據庫包含有關租戶(如名稱等)的信息以及每個租戶的應用程序特定數據庫。symfony 2/3應用程序中的多個連接和實體管理器
我在內部config.yml教義部構成的主和some_tenant連接和實體管理。
這讓我從一個控制器訪問主數據庫(例如,用於驗證和基於子域獲得租戶信息some_tenantsome_tenant.my-app.com)。而且它允許我在應用程序生命週期中使用特定於租戶的數據庫和實體管理器。
在我的配置教義部分看起來是這樣的:
doctrine:
dbal:
default_connection: 'master'
connections:
master:
driver: pdo_mysql
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
some_tenant:
driver: pdo_mysql
host: "%database_host_some_tenant%"
port: "%database_port_some_tenant%"
dbname: "%database_name_some_tenant%"
user: "%database_user_some_tenant%"
password: "%database_password_some_tenant%"
charset: UTF8
orm:
auto_generate_proxy_classes: "%kernel.debug%"
entity_managers:
master:
connection: master
mappings:
BEMultiTenancyBundle: ~
some_tenant:
connection: some_tenant
mappings:
AppBundle: ~
來了一部分,我很不滿意,並不能找到一個解決方案:
首先,租客會超過20個。它開始變得混亂,這樣改變了原理配置。 然後是另一個配置文件,稱爲tenants.yml保持更像啓用/禁用應用程式功能的信息,租戶特定的主題等
該文件被加載,使用Config Component驗證,和容器參數是設置,以便租戶配置可在應用範圍內使用。 我想將數據庫證書也存儲在該文件中。
我想創建基於該配置的連接和實體管理器。每個租戶一個,可在應用程序生命週期中使用。
我還需要在控制檯命令
bin/console doctrine:schema:update --em=some_tenant
上使用它們來更新每個租戶的數據庫schem和bin/console doctrine:schema:update --em=master
以更新master數據庫方案。
現在我想,要實現這一目標的唯一途徑是配置參數添加到理論部分編程後的appbundle被加載,並以前學說註冊表構造與給定的管理者和連接。
但我什至不能找到一個點,在那裏我可以實現這一點。
是否有另一種方法來到點1和2?
儘管有一個similiar question,我不確定它是否完全是大約相同的問題,並且是3歲左右,但我想用更多的解釋來發表這個問題。
每個租戶數據庫是否具有相同的模式和實體? – Cerad
是的。並且架構和映射在\ AppBundle \ Entity名稱空間中定義。 –
一個選擇是製作一個控制檯命令,它將根據tenants.yml生成您的doctrine.yml配置文件。這至少會消除一些添加新租戶的手動步驟。否則,我所能建議的只是查看Doctrine Bridge中的RegisterMappingsPass,看看你是否可以做類似的事情。 – Cerad