我最近开始使用Symfony 4,我期待根据子域设置默认数据库。
这是我需要为多个客户部署的应用程序,每个应用程序都有其特定的数据库。
我开始使用如下所示的连接。这个想法是使用环境中的变量一劳永逸地设置默认连接,但是我不知道如何。
我这样做正确吗?
doctrine:
dbal:
default_connection: customer1
connections:
customer1:
url: '%env(DATABASE_CUSTOMER1_URL)%'
driver: 'pdo_mysql'
server_version: '5.7'
charset: utf8mb4
default_table_options:
charset: utf8mb4
collate: utf8mb4_unicode_ci
customer2:
url: '%env(DATABASE_CUSTOMER2_URL)%'
driver: 'pdo_mysql'
server_version: '5.7'
charset: utf8mb4
default_table_options:
charset: utf8mb4
collate: utf8mb4_unicode_ci
答案 0 :(得分:0)
从配置角度来看,您处在正确的轨道上。但是请记住,这些连接不是由HTTP请求的子域触发的,而仅仅是根据实际PHP代码中的调用而连接到不同的数据库服务器。
您的None
driver.get("https://play.google.com/store/apps/details?id=in.amazon.mShop.android.shopping")
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.LINK_TEXT, "View details")))
driver.find_element_by_link_text('View details').click()
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH, "//div[contains(text(),'This app has access to')]")))
permissions = driver.find_element_by_xpath("//div[contains(text(),'This app has access to')]/parent::*")
变量应指定与MySQL实例的连接,例如text = permissions.get_attribute("innerText")
原则配置YAML的格式应略有不同,并应包含<html>
<head>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
</script>
</head>
<body>
<div id="multipleTrendChart"></div>
</body>
</html>
function drawMultipleTrendlineChart() {
var chart;
var data = new google.visualization.DataTable();
data.addColumn('date', 'Date');
data.addColumn('number', 'Sales value A');
data.addColumn('number', 'Sales value B');
data.addRows([
[new Date(2013, 3, 11), 200, 1000],
[new Date(2013, 4, 02), 500, 650],
[new Date(2013, 5, 03), 700, 550],
[new Date(2013, 6, 04), 800, 95],
[new Date(2013, 7, 05), 500, 400],
[new Date(2013, 8, 06), 900, 250],
[new Date(2014, 0, 07), 800, 300],
[new Date(2014, 1, 08), 2000, 200],
[new Date(2014, 2, 09), 1000, 312]
]);
var chartHeight = 400;
var chartWidth = 600;
var chartOptions = {
tooltip: {
isHtml: true
},
title: 'Trendlines with multiple lines',
isStacked: true,
width: chartWidth,
height: chartHeight,
colors: ['#0000D8', '#00dddd'],
hAxis: {
title: 'example title',
slantedText: false,
slantedTextAngle: 45,
textStyle: {
fontSize: 10
},
format: 'dd-MM-yyyy'
},
chartArea: {
left: 50,
top: 20,
width: (chartWidth - 10),
height: (chartHeight - 90)
}
};
chart = new google.visualization.LineChart(document.getElementById('multipleTrendChart'));
chart.draw(data, chartOptions);
}
配置。
env
https://symfony.com/doc/current/doctrine/multiple_entity_managers.html
您现在可以指定要使用的Connection / EntityManager。您可以区分它们,例如。在http主机上的Controller中。
DATABASE_CUSTOMER?_URL
或调用存储库
'mysql://user:secret@localhost/mydb'
答案 1 :(得分:0)
另一种方法是创建单独的环境以及将Web服务器指向的相应index_*.php
文件。几乎创建了两个新的应用程序条目index.php
文件-public/index_customer1.php
和public/index_customer2.php
副本。在您内部更改Symfony使用的环境:
<?php
...
$kernel = new AppKernel('customer1', false); # or new AppKernel('customer2', false)
...
?>
现在对于这两种环境,您都需要分别配置Doctrine
。在config/packages/customer1/config.yml
中:
imports:
- { resource: '../prod/' } # imports default prod env config
doctrine: # specify different database connection for whole env
dbal:
default_connection: default
connections:
default:
url: '%env(DATABASE_CUSTOMER1_URL)%'
driver: 'pdo_mysql'
server_version: '5.7'
charset: utf8mb4
和config/packages/customer2/config.yml
imports:
- { resource: '../prod/' }
doctrine:
dbal:
default_connection: default
connections:
default:
url: '%env(DATABASE_CUSTOMER2_URL)%'
driver: 'pdo_mysql'
server_version: '5.7'
charset: utf8mb4
https://symfony.com/doc/master/configuration/environments.html
并且您需要基于域将Web服务器配置为指向不同的index.php
。
答案 2 :(得分:0)
您尝试过类似的事情吗?
在您的引导程序中:
// load all the .env files
// (new Dotenv(false))->loadEnv(dirname(__DIR__).'/.env');
$d = new Dotenv(false);
$d->loadEnv(dirname(__DIR__).'/.env');
$s = dirname(__DIR__).'/.env.'.filter_input(INPUT_SERVER, 'SERVER_NAME');
if (is_readable($s) ) {
$d->load($s);
}
并使用
创建其他.env.server_name# your server_name database
DATABASE_URL=mysql://user:secret@localhost/mydb
Symfony Profiler
答案 3 :(得分:0)
我去过那里。您无需使用单独的连接或环境。添加新环境将添加大量缓存文件。
您可以根据子域在Web服务器级别设置环境变量,可以在apache中使用VirtualDocumentRoot,或者在Nginx中仅使用带通配符的服务器别名。
为您的网络服务器中的每个子域定义一个环境变量,您将可以在配置文件中使用它。