Как установить базу данных по умолчанию в зависимости от поддоменов в Symfony 4.2 - PullRequest
0 голосов
/ 03 июня 2019

Я недавно начал работать с Symfony 4 и с нетерпением жду настройки базы данных по умолчанию в зависимости от субдомена.

Это приложение, которое мне нужно развернуть для нескольких клиентов, и у каждого из них есть своя конкретная база данных.

Я начал работать с соединениями, как показано ниже.Идея заключалась бы в том, чтобы установить раз и навсегда соединение по умолчанию с переменной из env, но я не знаю, как.

Правильно ли я делаю это?

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

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Другой способ - создать отдельные среды и соответствующие файлы index_*.php, на которые вы указываете свой веб-сервер.В значительной степени создайте 2 новые копии файла приложения index.php file - 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

И вам необходимо настроить веб-сервер так, чтобы он указывал на разные index.php на основе домена.

0 голосов
/ 03 июня 2019

Вы находитесь на правильном пути с точки зрения конфигурации.Но имейте в виду, что эти соединения не инициируются поддоменом HTTP-запроса, а просто подключаются к другому серверу базы данных на основе вызова в реальном PHP-коде.

Ваша переменная env DATABASE_CUSTOMER?_URL должна указыватьподключение к экземпляру MySQL, что-то вроде 'mysql://user:secret@localhost/mydb'

И конфигурация доктрины YAML должна быть отформатирована немного по-другому и должна включать EntityManager config.

doctrine:
    dbal:
        default_connection: customer1
        connections:
            customer1:
                url: '%env(DATABASE_CUSTOMER1_URL)%'
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4
            customer2:
                url: '%env(DATABASE_CUSTOMER2_URL)%'
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4

    orm:
        default_entity_manager: customer1
        entity_managers:
            customer1:
                connection: customer1
            customer2:
                connection: customer2                

https://symfony.com/doc/current/doctrine/multiple_entity_managers.html

Теперь вы можете указать, какой Connection / EntityManager вы хотите использовать.Вы можете различить их, например.в ваших контроллерах по http хосту.

    public function someAction(Request $request)
    {
        if ($request->getHttpHost() === 'customer2url.com') {
            $em = $this->getDoctrine()->getManager('customer2');
        } else {
            $em = $this->getDoctrine()->getManager();
        }
    }

или хранилище вызовов

$this->getDoctrine()->getRepository(Entity::class, 'customer1')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...