Symfony: подключение к базе данных в зависимости от URL-адреса - PullRequest
0 голосов
/ 06 ноября 2018

Можно ли изменить соединение с базой данных в Symfony 4.1 по маршруту? У меня есть определенное количество пользователей, и у каждого есть своя собственная база данных, все базы данных имеют одинаковую схему.

Я нашел способ сделать это: например, для маршрута http://sub.domain.com/one_user

Я изменил файл конфигурации для доктрины так: (в php)

<?php

/**
*  config/packages/doctrine.php
*/

$user=explode('/',$_SERVER['REQUEST_URI'])[1];
require_once 'class_to_find_user_details.php';
$inits=new class_to_find_user_details($user);

$container->setParameter('env(DATABASE_URL)','');
$container->loadFromExtension('doctrine',
    array(
        'dbal'  => array(
            'driver'            => 'pdo_mysql',
            'server_version'    => '5.7',
            'charset'           => 'utf8mb4',
            'default_table_options' => array(
                'charset'       => 'utf8mb4',
                'collate'       => 'utf8mb4_unicode_ci',
            ),
            'url'               => 'mysql://'.$inits->dbUser.':'.$inits->dbPass.'@'.$inits->dbHost.':3306/'.$inits->dbName,
        ),
        'orm'   => array(
            'auto_generate_proxy_classes'   =>'%kernel.debug%',
            'naming_strategy'               =>'doctrine.orm.naming_strategy.underscore',
            'auto_mapping'                  => true,
            'mappings'                      => array(
                'App'       => array(
                    'is_bundle'     => false,
                    'type'          => 'annotation',
                    'dir'           => '%kernel.project_dir%/src/Entity',
                    'prefix'        => 'App\Entity',
                    'alias'         => 'App',
                ),
            ),
        )
    )
);

Все это прекрасно работает, но проблема в том, что конфигурация кэшируется, и когда я звоню http://sub.domain.com/second_user, я получаю данные от первого пользователя.

Есть ли способ предотвратить кэширование этой конфигурации? Или можно определить соединение с базой данных с контроллера?

Заранее благодарю за помощь.

mblaettermann, спасибо за ваш комментарий. Поэтому я попытался определить все соединения в файлах конфигурации. Следующим образом:

# config/packages/doctrine.yaml
parameters:
env(DATABASE_URL): ''
doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                driver:   pdo_mysql
                host:     'localhost'
                port:     '3306'
                dbname:   'db'
                user:     'userdb'
                password: 'pw'
                charset:  UTF8
            user1:
                driver:   pdo_mysql
                host:     'localhost'
                port:     '3306'
                dbname:   'dbNameUser1'
                user:     'dbUserUser1'
                password: 'dbPassUser1'
                charset:  UTF8
            user2:
                driver:   pdo_mysql
                host:     'localhost'
                port:     '3306'
                dbname:   'dbNameUser2'
                user:     'dbUserUser2'
                password: 'dbPassUser2'
                charset:  UTF8
    orm:
        default_entity_manager: default
        entity_managers:
            default:
                connection: default
                mappings:
                    App:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity'
                        prefix: 'App\Entity'
                        alias: App
            user1:
                connection: user1
                mappings:
                    user1:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity'
                        prefix: 'App\Entity'
                        alias: user1
            user2:
                connection: user2
                mappings:
                    user2:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity'
                        prefix: 'App\Entity'
                        alias: user2

Но я все еще не могу нормально использовать репозиторий и entityManager в моем контроллере: например:

$em = $this->getDoctrine()->getManager();
$listeClients=$em->getRepository(Clients::class)->findAll();

дает те же результаты, что и:

$em = $this->getDoctrine()->getManager('user1');
$listeClients=$em->getRepository(Clients::class)->findAll();

в обоих случаях я получаю результаты базы данных «по умолчанию». Я думаю, что проблема возникает из-за вызова в хранилище, потому что если я сделал:

$em = $this->getDoctrine()->getManager('user1');
$oneClient=$em->find(Clients::class,1);

Я получаю запись из базы данных 'user1'

...