Data-separação em um aplicativo Symfony Multi-inquilino usando Doutrina

votos
3

Eu estou tentando implementar uma aplicação multi-tenant, isto é - os dados de todos os clientes em um único banco de dados - cada mesa partilhada tem um tenant_idcampo para separar os dados

Eu desejo para conseguir a separação de dados, adicionando where('tenant_id = ', $user->getTenantID()){pseudoc-code} para todas as consultas SELECT eu não poderia encontrar qualquer solução up-front, mas aqui estão as possíveis abordagens que estou considerando. 1) abordagem bruto: a personalização de todos fetchAlle fetchOnefunções em cada classe (eu vou enlouquecer 2)) usando ouvintes: possivelmente que codificam para o preDqlSelectevento e adicionando o 'onde' a todas as consultas 3) substituição buildQuery(): Não foi possível encontrar um exemplo de este para front-end 4) implementar contentformfilter: de novo precisa de um ponteiro

Gostaria que alguém pudesse validar estes & comentar sobre efficieny, adequação. Além disso, se alguém tem alcançado multitenancy usando outra estratégia, pl ação. obrigado

Publicado 16/04/2010 em 08:11
fonte usuário
Em outras línguas...                            


4 respostas

votos
2

Eu estou trabalhando para fora uma solução usando Ouvintes Doutrina Grave codificando o evento preDqlSelect. Acho que este é o melhor e mais fácil maneira de fazer as coisas de uma forma genérica, ao invés de ter que modificar todas as classes de mesa e escrever consultas conscientes do inquilino. Com os ouvintes, multi-tenancy será completamente transparente para os desenvolvedores.

Obrigado por participar.

Respondeu 28/04/2010 em 12:43
fonte usuário

votos
1

Eu publiquei o sfMultiTenantPlugin, encontrá-lo aqui: http://www.symfony-project.org/plugins/sfMultiTenantPlugin

Respondeu 23/09/2010 em 14:49
fonte usuário

votos
1

Eu acredito que a maneira mais viável e segura é criar uma nova função para recuperar uma consulta consciente inquilino, este é um exemplo ... Substituir MyModel com o nome de sua tabela:

// lib/model/doctrine/MyModelTable.class.php
class MyModelTable extends Doctrine_Table
{
  public function createTenantAwareQuery($userId)
  {
    $q = $this->createQuery('m')
      ->where('tenant_id = ', $userId);
    return $q;
  }
}

Então a consumir esta nova função é só chamar:

$myVar = Doctrine_Core::getTable('MyModel')->createTenantAwareQuery()
  ->where('something = ', $value);

Desta forma, você criar um "inquilino consulta Aware" quando necessário ... você acabou de usar esta função quando necessário ... Mesmo no gerador de administração há um caminho no arquivo de configuração para substituir o método de consulta padrão:

# apps/backend/modules/(module)/config/generator.yml
config:
  list:
    table_method: retrieveTenantAwareResult

A única coisa que resta é criar este método.

Espero que esta resposta funciona para você =)

Respondeu 16/04/2010 em 16:26
fonte usuário

votos
0

O sfMultiTenantPluginplug-in não funciona para leftJoin. Quando A esquerda se juntar B e B está vazio, o plugin irá retornar um conjunto de resultados vazio.

Respondeu 17/12/2011 em 09:32
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more