Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como usar orquestral/tenanti no Laravel 5 para construir um aplicativo multilocatário com vários bancos de dados?


+1 para a resposta @morphatic, é bastante preciso na maioria das coisas.

Migração


Para seu banco de dados principal, você deve poder usar o padrão database/migration e utilize o php artisan make:migration e php artisan migrate .

No entanto, o Tenanti usará o caminho de migração definido na configuração "driver". por exemplo:
'path' => database_path('tenanti/user'),

Neste caso, a migração será criada/migrada de database/tenanti/user (você pode escolher outra pasta e ela usará essa pasta). Depois de configurar isso, você pode criar um novo arquivo de migração para o locatário do usuário via php artisan tenanti:make user create_blogs_table (como exemplo) e execute a migração via php artisan tenanti:migrate user (veja a semelhança entre o comando de migração do Laravel e o Tenanti?).

Motorista


Driver é apenas o agrupamento de um inquilino, você pode agrupar por usuários, empresas ou equipe etc. grupo" ou "motorista".

Autenticação ou acesso ao banco de dados


Em primeiro lugar, você precisa considerar como está planejando distinguir cada inquilino. Na maioria das vezes eu vejo as pessoas tendem a optar por subdomínio. Portanto, neste caso, você precisa verificar se o subdomínio pertence a algum usuário (consultando o banco de dados principal) usando um middleware e, em seguida, conectar-se ao banco de dados que pertence ao usuário.

O Tenanti não gerencia essa parte do processo, porque todos têm um estilo diferente nesse aspecto, mas fornecemos um código para se conectar dinamicamente ao seu locatário de banco de dados a partir de uma configuração de banco de dados básica.

Digamos que você tenha a seguinte configuração:
<?php

return [
    'fetch' => PDO::FETCH_CLASS,
    'default' => 'primary',
    'connections' => [
        'primary' => [
            //
        ],
        'tenants' => [
                'driver'    => 'mysql',
                'host'      => 'dbhost',     // for user with id=1
                'username'  => 'dbusername', // for user with id=1
                'password'  => 'dbpassword', // for user with id=1
                'charset'   => 'utf8',
                'collation' => 'utf8_unicode_ci',
                'prefix'    => '',
                'strict'    => false,
            ],
       ],
    ],
    'migrations' => 'migrations',
    'redis' => [ ... ],
];

Você pode seguir a etapa disponível em https://github.com/orchestral/ tenanti#multi-database-connection-setup e adicione o seguinte código.
<?php namespace App\Providers;

use Orchestra\Support\Facades\Tenanti;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Tenanti::setupMultiDatabase('tenants', function (User $entity, array $template) {
            $template['database'] = "tenant_{$entity->getKey()}";

            return $template;
        });
    }
}

Isso garantiria que você estivesse usando tenant_1 banco de dados para user=1, tenant_2 banco de dados para user=2 e assim por diante.
Então, como o Tenanti detecta qual usuário está ativo?
É aqui que você precisa adicionar lógica ao seu middleware.
$user = App\User::whereSubdomain($request->route()->parameter('tenant'))->first();

Tenanti::driver('user')->asDefaultDatabase($user, 'tenants_{id}');