Как работать с множеством менеджеров сущностей и соединениями

Вы можете использовать множество менеджеров сущностей Doctrine или соединений в приложении Symfony. Это необходимо, если вы используете разные базы данных, или даже поставщиков с абсолютно разными наборами сущностей. Другими словами, один менеджер сущностей, который соединяется с одной базой данных, будет управлять некоторыми сущностями, в то время как другой менеджер сущностей, который соединяется с другой базой данных, может управлять всеми остальными.

Note

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

Следующий код конфигурации показывает, как вы можете сконфигурироваь два менеджера сущностей:

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    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
                customer:
                    driver:   pdo_mysql
                    host:     '%database_host2%'
                    port:     '%database_port2%'
                    dbname:   '%database_name2%'
                    user:     '%database_user2%'
                    password: '%database_password2%'
                    charset:  UTF8
    
        orm:
            default_entity_manager: default
            entity_managers:
                default:
                    connection: default
                    mappings:
                        AppBundle:  ~
                        AcmeStoreBundle: ~
                customer:
                    connection: customer
                    mappings:
                        AcmeCustomerBundle: ~
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <?xml version="1.0" encoding="UTF-8"?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:doctrine="http://symfony.com/schema/dic/doctrine"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/doctrine
            http://symfony.com/schema/dic/doctrine/doctrine-1.0.xsd">
    
        <doctrine:config>
            <doctrine:dbal default-connection="default">
                <doctrine:connection name="default"
                    driver="pdo_mysql"
                    host="%database_host%"
                    port="%database_port%"
                    dbname="%database_name%"
                    user="%database_user%"
                    password="%database_password%"
                    charset="UTF8"
                />
    
                <doctrine:connection name="customer"
                    driver="pdo_mysql"
                    host="%database_host2%"
                    port="%database_port2%"
                    dbname="%database_name2%"
                    user="%database_user2%"
                    password="%database_password2%"
                    charset="UTF8"
                />
            </doctrine:dbal>
    
            <doctrine:orm default-entity-manager="default">
                <doctrine:entity-manager name="default" connection="default">
                    <doctrine:mapping name="AppBundle" />
                    <doctrine:mapping name="AcmeStoreBundle" />
                </doctrine:entity-manager>
    
                <doctrine:entity-manager name="customer" connection="customer">
                    <doctrine:mapping name="AcmeCustomerBundle" />
                </doctrine:entity-manager>
            </doctrine:orm>
        </doctrine:config>
    </container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    $container->loadFromExtension('doctrine', array(
        'dbal' => array(
            'default_connection' => 'default',
            'connections' => array(
                'default' => array(
                    'driver'   => 'pdo_mysql',
                    'host'     => '%database_host%',
                    'port'     => '%database_port%',
                    'dbname'   => '%database_name%',
                    'user'     => '%database_user%',
                    'password' => '%database_password%',
                    'charset'  => 'UTF8',
                ),
                'customer' => array(
                    'driver'   => 'pdo_mysql',
                    'host'     => '%database_host2%',
                    'port'     => '%database_port2%',
                    'dbname'   => '%database_name2%',
                    'user'     => '%database_user2%',
                    'password' => '%database_password2%',
                    'charset'  => 'UTF8',
                ),
            ),
        ),
    
        'orm' => array(
            'default_entity_manager' => 'default',
            'entity_managers' => array(
                'default' => array(
                    'connection' => 'default',
                    'mappings'   => array(
                        'AppBundle'  => null,
                        'AcmeStoreBundle' => null,
                    ),
                ),
                'customer' => array(
                    'connection' => 'customer',
                    'mappings'   => array(
                        'AcmeCustomerBundle' => null,
                    ),
                ),
            ),
        ),
    ));
    

В этом случае, вы определили два менеджера сущностей и назвали их default и customer. Менеджер сущностей default управляет сущностями в пакетах AppBundle и AcmeStoreBundle, а менеджер сущностей customer - в пакете AcmeCustomerBundle. Вы также определили два соединения, по одному для каждого менеджера.

Note

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

При работе с множеством соединений, для создания ваших БД:

1
2
3
4
5
# Играть только с соединением "default"
$ php bin/console doctrine:database:create

# Играть только с соединением "customer"
$ php bin/console doctrine:database:create --connection=customer

При работе с множеством менеджеров сущностей, обновите вашу схему:

1
2
3
4
5
# Играть только с отображениями "default"
$ php bin/console doctrine:schema:update --force

# Играть только с отображениями "customer"
$ php bin/console doctrine:schema:update --force --em=customer

Если вы упустите имя менеджера сущностей при его запросе, будет возвращён менеджер сущностей по умолчанию (т.е. default):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Common\Persistence\ManagerRegistry;

class UserController extends Controller
{
    public function indexAction(EntityManagerInterface $em, ManagerRegistry $doctrine)
    {
        // Все 4 возвращают менеджер сущностей "default"
        // $em из EntityManagerInterface
        $em = $doctrine->getManager();
        $em = $doctrine->getManager('default');
        $em = $this->get('doctrine.orm.default_entity_manager');

        // Оба возвращают менеджер сушностей "customer"
        $customerEm = $doctrine->getManager('customer');
        $customerEm = $this->get('doctrine.orm.customer_entity_manager');
    }
}

Теперь вы можете использовать Doctrine так же, как и раньше - путём использования менеджера сущностей default для сохранения и возврата сущностей, которыми он управляет, и менеджера сущностей customer для сохранения и возврате его сущностей.

То же самое применяется к вызовам хранилиша:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
use Doctrine\Common\Persistence\ManagerRegistry;

class UserController extends Controller
{
    public function indexAction(ManagerRegistry $doctrine)
    {
        // Вернуть хранилище, которым управляет менеджер сущностей "default"
        $products = $doctrine->getRepository('AcmeStoreBundle:Product')
            ->findAll()
        ;

        // Подробный способ справиться с менеджером сущностей "default"
        $products = $doctrine->getRepository('AcmeStoreBundle:Product', 'default')
            ->findAll()
        ;

        // Возвращает хранилище, которым управляет менеджер сущностей "customer"
        $customers = $doctrine->getRepository('AcmeCustomerBundle:Customer', 'customer')
            ->findAll()
        ;
    }
}

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.