Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie verwende ich Orchestral/Tenanti in Laravel 5, um eine Multi-Tenant-Anwendung mit mehreren Datenbanken zu erstellen?

+1 an @morphatic answer, es ist ziemlich genau bei den meisten Sachen.

Migration

Für Ihre Hauptdatenbank sollten Sie in der Lage sein, die Standardeinstellung database/migration zu verwenden und verwenden Sie php artisan make:migration und php artisan migrate .

Tenanti verwendet jedoch den Migrationspfad, der unter der „Treiber“-Konfiguration festgelegt ist. B.:

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

In diesem Fall wird die Migration von database/tenanti/user erstellt/migriert (Sie können einen anderen Ordner auswählen und dieser Ordner wird verwendet). Sobald Sie dies eingerichtet haben, können Sie über php artisan tenanti:make user create_blogs_table eine neue Migrationsdatei für den Benutzermandanten erstellen (als Beispiel) und führen Sie die Migration über php artisan tenanti:migrate user aus (Sehen Sie die Ähnlichkeit zwischen dem Laravel-Migrationsbefehl und Tenanti?).

Fahrer

Treiber ist nur die Gruppierung eines Mandanten, Sie können ihn vielleicht nach Benutzern, Unternehmen oder Teams usw. gruppieren. Und es besteht die Möglichkeit, dass Sie mehr als eine Art von Gruppe pro Projekt benötigen, da Sie sonst meistens nur einzelne verwenden. Gruppe" oder "Fahrer".

Authentifizierung oder Zugriff auf DB

Zunächst einmal müssen Sie überlegen, wie Sie die einzelnen Mandanten unterscheiden möchten. Die meiste Zeit würde ich sehen, dass sich die Leute für Subdomains entscheiden. In diesem Fall müssen Sie also mithilfe einer Middleware prüfen, ob die Subdomain einem der Benutzer gehört (durch Abfragen der Hauptdatenbank), und sich dann mit der Datenbank verbinden, die dem Benutzer gehört.

Tenanti verwaltet diesen Teil des Prozesses nicht, da jeder in diesem Aspekt einen anderen Stil hat, aber wir stellen einen Code bereit, um von einer Basisdatenbankkonfiguration aus dynamisch eine Verbindung zu Ihrem Datenbankmandanten herzustellen.

Nehmen wir an, Sie haben die folgende Konfiguration:

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

Sie können dem unter https://github.com/orchestral/ verfügbaren Schritt folgen. tenanti#multi-database-connection-setup und fügen Sie den folgenden Code hinzu.

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

Dadurch würde sichergestellt, dass Sie tenant_1 verwenden Datenbank für Benutzer=1, tenant_2 Datenbank für Benutzer=2 und so weiter.

Wie erkennt Tenanti also, welcher Benutzer aktiv ist?

Hier müssen Sie Ihrer Middleware Logik hinzufügen.

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

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