1
resposta

[Dúvida] [Doctrine PHP] Trabalhando com vários schemas na mesma aplicação

Eu tenho um banco de dados que possui vários schemas, e a estrutura das tabelas deles são todos idênticos. Hoje nós trabalhamos com 1 schema para cada cliente que nós temos.

No Doctrine, aparentemente você precisa definir o schema na própria anotação das entidades, mas não é viável utilizar desse jeito, porque imagine que a cada cliente que entrar, nós teremos que replicar as entidades, só para esse cliente novo.

Eu pesquisei pela internet sobre essa situação, mas não consegui encontrar uma solução pra isso. A ideia era que o schema fosse colocado junto no dbname, mas eu não sei qual o separador que devo usar. Por exemplo: Nome do banco de dados é 'prod_umov_dbview', e o schema é 'u35554', então o dbname teria que ser 'prod_umov_dbview/u35554'. Eu tentei fazer isso, mas não funcionou.

Alguém consegue me ajudar com isso?

1 resposta

Olá Cristofer, tudo bem?

Entendo a sua dificuldade em trabalhar com vários schemas no Doctrine. Felizmente, existe uma solução para o seu problema.

Uma alternativa viável é utilizar a funcionalidade de eventos do Doctrine para definir o schema dinamicamente, de acordo com o cliente que está sendo atendido. Dessa forma, você não precisará replicar as entidades para cada cliente novo.

Você pode criar um listener de eventos que será responsável por definir o schema de acordo com o cliente. Por exemplo:

use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;

class SchemaListener
{
    public function postGenerateSchema(GenerateSchemaEventArgs $eventArgs)
    {
        $schema = $eventArgs->getSchema();
        $clientSchema = $schema->createSchemaConfig();

        // Defina aqui a lógica para obter o schema do cliente atual
        $clientSchemaName = obterSchemaDoCliente();

        // Defina o schema para as tabelas
        foreach ($schema->getTableNames() as $tableName) {
            $table = $schema->getTable($tableName);
            $table->addOption('schema', $clientSchemaName);
        }
    }
}

Depois de criar o listener de eventos, você precisará registrá-lo no Doctrine. Por exemplo:

use Doctrine\ORM\Events;

$evm = $entityManager->getEventManager();
$evm->addEventListener(Events::postGenerateSchema, new SchemaListener());

Dessa forma, sempre que o Doctrine gerar o schema, o listener de eventos será acionado e definirá o schema de acordo com o cliente atual.

Abraços e Bons estudos!