如何根据symfony 4.2中的子域设置默认数据库

时间:2019-06-03 08:23:03

标签: symfony

我最近开始使用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

4 个答案:

答案 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.phppublic/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中仅使用带通配符的服务器别名。

为您的网络服务器中的每个子域定义一个环境变量,您将可以在配置文件中使用它。