Чтобы использовать различные Entity Manager/Connection на основе URL-адреса в Symfony, достаточно просто. Со следующей конфигурацией маршрутизации
connection:
pattern: /a/{connection}
defaults: { _controller: AcmeTestBundle:User:index }
и из следующей Cookbook;
Как работать с несколькими диспетчерами сущностей и подключениями
Мой контроллер будет выглядеть примерно так:
class UserController extends Controller
{
public function indexAction($connection)
{
$products = $this->get('doctrine')
->getRepository('AcmeStoreBundle:Product', $connection)
->findAll()
;
..................
и я смогу получить информацию о продукте из разных em/connection/database.
Теперь, если я добавлю что-то вроде этого в мою маршрутизацию,
login:
pattern: /a/{connection}/login
defaults: { _controller: FOSUserBundle:Security:login }
Как я могу легко заставить логин использовать соединение, как определено в переменной соединения?
Эта настройка предполагает, что каждая база данных имеет свою собственную регистрационную информацию пользователя (таблица fos_user).
Изменить: обновленная информация о маршрутизации
Edit2:
Я все еще новичок в PHP/Symfony/Doctrine, поэтому, пожалуйста, простите меня, если я полностью ошибаюсь. Я попытался вручную установить соединение в FOS\UserBundle\Doctrine\UserManager. Следующим является конструктор класса
//
use Doctrine\Common\Persistence\ObjectManager;
//
public function __construct(EncoderFactoryInterface $encoderFactory, CanonicalizerInterface $usernameCanonicalizer, CanonicalizerInterface $emailCanonicalizer, ObjectManager $om, $class)
{
parent::__construct($encoderFactory, $usernameCanonicalizer, $emailCanonicalizer);
$this->objectManager = $om;
$this->repository = $om->getRepository($class);
$metadata = $om->getClassMetadata($class);
$this->class = $metadata->getName();
}
В контроллере мы можем использовать следующий метод для изменения em на 'testing'
$em = $this->get('doctrine')->getManager('testing');
$repository = $this->get('doctrine')->getRepository($class, 'testing')
Для этого я изменил код на следующий, чтобы использовать EntityManager вместо ObjectManager.
//
//use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\ORM\EntityManager;
//
public function __construct(EncoderFactoryInterface $encoderFactory, CanonicalizerInterface $usernameCanonicalizer, CanonicalizerInterface $emailCanonicalizer, EntityManager $om, $class)
{
parent::__construct($encoderFactory, $usernameCanonicalizer, $emailCanonicalizer);
$this->objectManager = $om;
$this->repository = $om->getRepository($class);
$metadata = $om->getClassMetadata($class);
$this->class = $metadata->getName();
}
Мое приложение отлично работает без ошибок.
Из того, как он работает с контроллером, я попытался изменить соединение, добавив параметр в эту строку, но он все еще использует соединение по умолчанию.
$this->repository = $om->getRepository($class, 'testing');
Что еще я могу здесь пропустить?