Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment utiliser orchestral/tenanti dans Laravel 5 pour créer une application multi-tenant avec plusieurs bases de données ?

+1 à la réponse @morphatic, c'est assez précis sur la plupart des choses.

Migration

Pour votre base de données principale, vous devriez pouvoir utiliser la valeur par défaut database/migration et utilisez php artisan make:migration et php artisan migrate .

Le locataire utilisera cependant le chemin de migration défini dans la configuration du "pilote". ex :

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

Dans ce cas, la migration sera créée/migrée depuis database/tenanti/user (vous pouvez choisir un autre dossier et il utilisera ce dossier). Une fois que vous avez configuré cela, vous pouvez créer un nouveau fichier de migration pour le locataire utilisateur via php artisan tenanti:make user create_blogs_table (par exemple) et exécutez la migration via php artisan tenanti:migrate user (voir la similarité entre la commande de migration Laravel et Tenanti ?).

Chauffeur

Le pilote n'est que le regroupement d'un locataire, vous le regroupez peut-être par utilisateurs, entreprises ou équipe, etc. Et il est possible que vous ayez besoin de plus d'un type de groupe par projet, sinon la plupart du temps, vous n'utilisez qu'un seul " groupe" ou "conducteur".

Authentification ou accès à la base de données

Tout d'abord, vous devez réfléchir à la façon dont vous envisagez de distinguer chaque locataire. La plupart du temps, je verrais que les gens ont tendance à opter pour un sous-domaine. Dans ce cas, vous devez donc vérifier si le sous-domaine appartient à l'un des utilisateurs (en interrogeant la base de données principale) à l'aide d'un middleware, puis vous connecter à la base de données qui appartient à l'utilisateur.

Tenanti ne gère pas cette partie du processus, car tout le monde a un style différent sur cet aspect, mais nous fournissons un code pour se connecter dynamiquement à votre locataire de base de données à partir d'une configuration de base de données de base.

Supposons que vous ayez la configuration suivante :

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

Vous pouvez suivre l'étape disponible dans https://github.com/orchestral/ tenanti#multi-database-connection-setup et ajoutez le code suivant.

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

Cela garantirait que vous utilisez tenant_1 base de données pour user=1, tenant_2 base de données pour user=2 et ainsi de suite.

Alors, comment Tenanti détecte-t-il quel utilisateur est actif ?

C'est là que vous devez ajouter une logique dans votre middleware.

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

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