Mysql
 sql >> Database >  >> RDS >> Mysql

Come utilizzare orchestral/tenanti in Laravel 5 per creare un'applicazione multi-tenant con più database?

+1 alla risposta @morphatic, è abbastanza preciso sulla maggior parte delle cose.

Migrazione

Per il tuo database principale dovresti essere in grado di utilizzare il database/migration predefinito e utilizza php artisan make:migration e php artisan migrate .

Tenanti utilizzerà invece il percorso di migrazione impostato nella configurazione "driver". es:

'path' => database_path('tenanti/user'),

In questo caso la migrazione verrà creata/migrata da database/tenanti/user (puoi scegliere un'altra cartella e utilizzerà quella cartella). Una volta impostato questo, puoi creare un nuovo file di migrazione per l'utente tenant tramite php artisan tenanti:make user create_blogs_table (ad esempio) ed eseguire la migrazione tramite php artisan tenanti:migrate user (vedi la somiglianza tra il comando di migrazione Laravel e Tenanti?).

Autista

Il driver è solo il raggruppamento di un inquilino, forse lo stai raggruppando per utenti, aziende o team, ecc. E c'è la possibilità che tu possa richiedere più di un tipo di gruppo per progetto, altrimenti la maggior parte delle volte utilizzerai solo un singolo " gruppo" o "driver".

Autenticazione o accesso al DB

Prima di tutto, devi considerare come intendi distinguere ogni inquilino. La maggior parte delle volte vedrei che le persone tendono a optare per il sottodominio. Quindi in questo caso è necessario verificare se il sottodominio appartiene a qualcuno degli utenti (interrogando il database principale) utilizzando un middleware e quindi connettersi al database che appartiene all'utente.

Tenanti non gestisce quella parte del processo, perché ognuno ha uno stile diverso su questo aspetto, ma forniamo un codice per connettersi dinamicamente al tenant del database da una configurazione del database di base.

Supponiamo che tu abbia la seguente configurazione:

<?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' => [ ... ],
];

Puoi seguire il passaggio disponibile in https://github.com/orchestral/ tenanti#multi-database-connection-setup e aggiungi il seguente codice.

<?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;
        });
    }
}

Ciò ti assicurerebbe di utilizzare tenant_1 database per utente=1, tenant_2 database per utente=2 e così via.

Quindi come fa Tenanti a rilevare quale utente se attivo?

Qui è dove devi aggiungere la logica nel tuo middleware.

$user = App\User::whereSubdomain($request->route()->parameter('tenant'))->first();

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