Отдельные базы данных в Symfony 4 - PullRequest
0 голосов
/ 30 августа 2018

Я создаю приложение symfony ( 4.1 ) и хочу разделить управление идентификацией в отдельной базе данных.

Затем я настраиваю доктрину следующим образом

doctrine:
  dbal:
    default_connection: default
    connections:
      default:
        url: '%env(DATABASE_URL)%'
        driver: 'pdo_mysql'
        mapping_types:
          enum: string
      identity:
        url: '%env(IDENTITY_DATABASE_URL)%'
        driver: 'pdo_pgsql'
  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'

      identity:
        auto_mapping: true
        connection: identity
        mappings:
          ACL:
            is_bundle: false
            type: annotation
            dir: '%kernel.project_dir%/src/Entity/Identity'
            prefix: 'App\Entity\Identity'

В contoller я хочу получить users из удостоверения базы данных.

Есть способ использования

$this->getDoctrine()->getRepository(User::class, 'identity')->findAll();

Запуск php bin/console server:run. Похоже, что в следующем коде используется база данных по умолчанию вместо identity one.

Я что-то пропустил для включения шардинга в symfony?

С уважением,

1 Ответ

0 голосов
/ 30 августа 2018

Вы должны ввести правильного менеджера сущности (т. Е. Личность). Соответствующее имя службы - «doctrine.orm.identit_entity_manager».

Если вы хотите это в контроллере, я бы предложил привязать этот сервис в качестве аргумента в services.yaml:

App\Controller\FooController:
        bind:
            $identityManager: '@doctrine.orm.identity_entity_manager'

Тогда в вашем контроллере просто введите его через автопроводку и используйте его как положено:

class FooController extends AbstractController {

/**
 * @Route("/bar", name="bar")
 */
public function bar($identityManager) {
    ...
    $identityManager->getRepository(User::class)->findAll();
    ...
}

Я скачал и запустил ваш проект с github. Оказывается, что, как я уже заметил в моих комментариях, проблема заключалась в плохой конфигурации менеджеров сущностей в doctrine.yaml. Чтобы ваша программа работала корректно (она работала для меня), вы должны создать две новые директории (/ src / Entity / First, / src / Entity / Second), поместите файлы First.php и Second.php в эти директории соответственно. затем изменить вашу конфигурацию в doctrine.yaml на

doctrine:
dbal:
    default_connection: default
    connections:
        default:
            url: '%env(DATABASE_URL)%'
            driver: 'pdo_mysql'
            server_version: '5.7'
            charset: utf8mb4
        second:
            url: '%env(SECOND_DATABASE_URL)%'
            driver: 'pdo_mysql'
            server_version: '5.7'
            charset: utf8mb4

orm:
    default_entity_manager: default
    entity_managers:
        default:
            connection: default
            mappings:
                Main:
                    is_bundle: false
                    type: annotation
                    dir: '%kernel.project_dir%/src/Entity/First'
                    prefix: 'App\Entity\First'
                    alias: First
        second:
            connection: second
            mappings:
                Second:
                    is_bundle: false
                    type: annotation
                    dir: '%kernel.project_dir%/src/Entity/Second'
                    prefix: 'App\Entity\Second'
                    alias: Second

И тебе пора.

Проблема заключалась в том, что оба менеджера сущностей были сконфигурированы для обработки одних и тех же сущностей (с помощью опций "dir" и "prefix" в разделе orm). Это привело к конфликтам с непредсказуемым поведением. Действительно, из-за этого конфликта это был первый менеджер сущностей, который был вызван в хранилище Второго класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...