+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.
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}');