Como trabalhar com Múltiplos Gerenciadores de Entidade

Você pode usar múltiplos gerenciadores de entidades em uma aplicação Symfony2. Isto é necessário se você está usando bancos de dados diferentes ou algum vendor com conjuntos de entidades completamente diferentes. Em outras palavras, um gerenciador de entidades que conecta em um banco de dados manipulará algumas entidades enquanto um outro gerenciador de entidades que conecta a um outro banco de dados irá manupular as entidades restantes.

Nota

Usar múltiplos gerenciadores de entidade é muito fácil, mas mais avançado e geralmente não necessário. Certifique se você realmente precisa de múltiplos gerenciadores de entidades antes de adicionar esta camada de complexibilidade.

O código de configuração seguinte mostra como configurar dois gerenciadores de entidade:

  • YAML
    doctrine:
        orm:
            default_entity_manager:   default
            entity_managers:
                default:
                    connection:       default
                    mappings:
                        AcmeDemoBundle: ~
                        AcmeStoreBundle: ~
                customer:
                    connection:       customer
                    mappings:
                        AcmeCustomerBundle: ~
    

Neste caso, você deve definir dois gerenciadores de entidade e chamá-los de default e customer. O gerenciador de entidade default manipula as entidades em AcmeDemoBundle e AcmeStoreBundle, enquanto o gerenciador de entidades customer manipula as entidades AcmeCustomerBundle.

Quando estiver trabalhando com múltiplos gerenciadores de entidade, você deve ser explícito sobre qual gerenciador de entidade você quer. Se você omitir o nome do gerenciador de entidade quando você atualizar o seu schema, será usado o padrão (ou seja, default):

# Play only with "default" mappings
php app/console doctrine:schema:update --force

# Play only with "customer" mappings
php app/console doctrine:schema:update --force --em=customer

Se você omitir o nome do gerenciador de entidade ao solicitar ele, o gerenciador de entidade padrão (ou seja, default) é retornado:

class UserController extends Controller
{
    public function indexAction()
    {
        // both return the "default" em
        $em = $this->get('doctrine')->getManager();
        $em = $this->get('doctrine')->getManager('default');

        $customerEm =  $this->get('doctrine')->getManager('customer');
    }
}

Agora você pode usar Doctrine exatamente da mesma forma que você fez antes - usando o gerenciador de entidade default para persistir e buscar as entidades que ele gerencia, e o gerenciador de entidade customer para persistir e buscar suas entidades.

O mesmo se aplica para chamadas de repositório:

class UserController extends Controller
{
    public function indexAction()
    {
        // Retrieves a repository managed by the "default" em
        $products = $this->get('doctrine')
                         ->getRepository('AcmeStoreBundle:Product')
                         ->findAll();

        // Explicit way to deal with the "default" em
        $products = $this->get('doctrine')
                         ->getRepository('AcmeStoreBundle:Product', 'default')
                         ->findAll();

        // Retrieves a repository managed by the "customer" em
        $customers = $this->get('doctrine')
                          ->getRepository('AcmeCustomerBundle:Customer', 'customer')
                          ->findAll();
    }
}