Можно ли изменить соединение с базой данных в 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'