Симфония 2 - Совместное использование пользователей между несколькими приложениями


В настоящее время я ищу способ обмена пользователями между несколькими приложениями Symfony2 для одного из наших клиентов. За последние 3 года мы сделали для них несколько приложений (4), которые имеют разные цели, но всегда используют "одну и ту же" модель пользователя и данные.

В настоящее время у нас есть 4 отдельные базы данных, где таблица "пользователи" примерно одинакова во всех приложениях, за исключением отношений "многие ко многим". Сначала я думал о добавлении второго менеджера сущностей (и подключение) и помещает пользователей в отдельную базу данных. Все приложения смогут использовать это, и все пользователи будут иметь одинаковые учетные данные. Но как мне справиться с отношениями "многие ко многим"?

Чтобы привести пример, в приложении A у вас есть отношение "многие ко многим" от "Пользователей" до "Клиентов", но таблица "Клиенты" не существует в приложении B/C/D. В приложении B у вас есть отношение "многие ко многим" от "Пользователей" до "Поставщиков", но таблицы "Поставщики" не существует в приложении A/C/D и так далее. Перемещение таблицы "Клиенты" или "Поставщики" в общую базу данных на самом деле также не является вариантом, поскольку другие сущности (которые не являются общими) также имеют отношения к этим таблицам.

Мне в основном нужно найти способ сопоставить отношения "многие ко многим" в модели/базе данных "общий пользователь", которые уникальны для каждого приложения. Есть ли способ добиться этого с помощью нескольких баз данных? Должен ли я пойти на какой-то другой подход?

Вся информация приветствуется. Заранее спасибо.

Author: M. Winterinho, 2016-11-28

1 answers

Вариант 1

Используя различные соединения, это, по-видимому, невозможно с помощью доктрины из коробки.

На аналогичные вопросы уже были даны ответы:

Как указано в первом ответе, вы могли бы сделать следующее:

Сохраняйте графики объектов отключенными, сохраняя идентификаторы связанные объекты (старый стиль) вместо ссылки на них, затем вручную получите объекты через службы.

Но если вы хотите, чтобы Доктрина действительно знала об ассоциациях, вам необходимо сохранить связанные объекты в одной базе данных, иначе ваше сопоставление просто приведет к ошибкам. Это означает, что вам нужно будет дублировать сущность пользователя.

Вариант 2

В очень конкретном случае, когда вы можете использовать одно и то же соединение (то есть с несколькими базами данных та же СУБД на том же хосте и с тем же пользователем), кажется, есть способ, но я его не тестировал: https://techpunch.co.uk/development/using-multiple-databases-with-symfony2-and-doctrine2

Идея состоит в том, чтобы добавить к каждой таблице имя базы данных, как если бы это было имя схемы, например:

Эта сущность сопоставляется с таблицей "Пользователь" в базе данных "пользователи":

<?php
namespace Demo\UserBundle\Entity;
use DoctrineORMMapping as ORM;

/**
 * @ORMTable(name="users.User")
 */
class User
{
  /* ... */
}

Это сопоставлено с таблицей "Post" в базе данных "сообщения":

<?php
namespace Demo\PostBundle\Entity;
use DoctrineORMMapping as ORM;

/**
 * @ORMTable(name="posts.Post")
 */
class Post
{
  /* ... */
}

Тогда ты может создавать ассоциации, как обычно:

class Post
{
    /**
     * @ORM\ManyToOne(targetEntity="\Demo\UserBundle\Entity\User")
     **/
    private $user;
    /* ... */
}

Автор также ссылается на пример проекта на github: https://github.com/lobsterdore/symfony2-multiple-db-example

 3
Author: Victor Toulouse, 2017-05-23 12:17:13