Symfony3: Как установить несколько подключений?


Я работаю с приложением Symfony3 и хочу настроить несколько подключений к разным базам данных.

Я осмотрелся и нашел документацию о EntityManagers и подключениях к БД. Мой файл config.yml настроен следующим образом:

Конфигурация.yml

doctrine:
dbal:
    default_connection: default
    connections:
            default:
                    driver:   pdo_mysql
                    host:     "%database_host%"
                    port:     "%database_port%"
                    dbname:   "%database_name%"
                    user:     "%database_user%"
                    password: "%database_password%"
                    charset:  UTF8
                    mapping_types:
                      enum: string
            other:
                    driver:   pdo_mysql
                    host:     "%database_host2%"
                    port:     "%database_port2%"
                    dbname:   "%database_name2%"
                    user:     "%database_user2%"
                    password: "%database_password2%"
                    charset:  UTF8
                    mapping_types:
                      enum: string
orm:
    dql:
         string_functions:
                DAY:   DoctrineExtensions\Query\Mysql\Day
                MONTH: DoctrineExtensions\Query\Mysql\Month
                YEAR:  DoctrineExtensions\Query\Mysql\Year
    auto_generate_proxy_classes: "%kernel.debug%"
    naming_strategy: doctrine.orm.naming_strategy.underscore
    auto_mapping: true

Так что теперь я могу получить доступ к своей базе данных следующим образом:

$con2 = $this->get('doctrine.dbal.other_connection');
$orders = $con2->fetchAll('SELECT * FROM orders');

Но что мне действительно нужно, так это настроить второе соединение с отображением orm, которое позволит мне взаимодействовать с сущностями вместо работа со второй базой данных напрямую. Итак, опять же, как говорится в документации, я добавил под ярлыком doctrine orm:

orm:
    dql:
         string_functions:
                DAY:   DoctrineExtensions\Query\Mysql\Day
                MONTH: DoctrineExtensions\Query\Mysql\Month
                YEAR:  DoctrineExtensions\Query\Mysql\Year
    auto_generate_proxy_classes: "%kernel.debug%"
    naming_strategy: doctrine.orm.naming_strategy.underscore
    auto_mapping: true

    default_entity_manager: default
    entity_managers:
        default:
            connection: default
            mappings:
                AppBundle:  ~      
        other:
            connection: other
            mappings:
                OtherBundle: ~

Это создает исключение:

Исключение синтаксического анализа в Parser.php строка 296: Невозможно выполнить синтаксический анализ в строке 78 (рядом с "entity_managers:").

Как мне настроить файл config.yml, чтобы разрешить сопоставление orm для моего второго подключения к базе данных? Должен ли я удалить метку dql и использовать ее только под определенной меткой менеджера сущностей?

Author: Jotaeme, 2016-04-22

3 answers

Попробуйте вот это:

doctrine:
    orm:
        auto_generate_proxy_classes: true
        entity_managers:
            default:
                mappings:
                    AppBundle: ~
                naming_strategy: doctrine.orm.naming_strategy.underscore
                dql:
                   string_functions:
                       DAY: DoctrineExtensions\Query\Mysql\Day
            other:
                mappings:
                    OtherBundle: ~
 2
Author: d.garanzha, 2016-04-22 10:29:06

Проверьте документ здесь для получения полной информации о конфигурации доктрины.

Проверьте отступ функции dql и т.д.

Вероятно, мы используем Сокращенный синтаксис конфигурации, где все доступные параметры могут быть размещены непосредственно на уровне конфигурации doctrine.orm.

Надеюсь, это поможет

 3
Author: Matteo, 2016-04-22 08:48:08

Я решил эту проблему. Спасибо за ответы, потому что они в значительной степени были решением. Мне просто нужно было использовать метки на их правильных уровнях.

На всякий случай, если это может быть кому-то полезно, я опубликую то, что я сделал:

Конфигурация.yml

 orm:

    entity_managers:
        default:
            mappings:
                AppBundle: ~
            naming_strategy: doctrine.orm.naming_strategy.underscore
            auto_mapping: true
            dql:
                         string_functions:
                                DAY:   DoctrineExtensions\Query\Mysql\Day
                                MONTH: DoctrineExtensions\Query\Mysql\Month
                                YEAR:  DoctrineExtensions\Query\Mysql\Year
        other:
            mappings:
                OtherBundle: ~
            naming_strategy: doctrine.orm.naming_strategy.underscore

    auto_generate_proxy_classes: "%kernel.debug%"

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

$orders = $this->get('doctrine')
        ->getRepository('OtherBundle:Orders', 'other')
        ->findAll();

Теперь вы готовы иди.

Спасибо за вашу помощь.

 0
Author: Jotaeme, 2016-04-25 07:30:58