Heim > PHP-Framework > Laravel > Erfahren Sie, wie Sie Ihre Laravel-Anwendung in wenigen Minuten mandantenfähig machen

Erfahren Sie, wie Sie Ihre Laravel-Anwendung in wenigen Minuten mandantenfähig machen

藏色散人
Freigeben: 2020-08-01 13:25:38
nach vorne
4967 Leute haben es durchsucht
Das Folgende wird von

Laravel vorgestellt. In der Tutorial-Kolumne wird in wenigen Minuten die Methode zum Erstellen von Laravel-Anwendungen mit mehreren Mandanten vorgestellt Freunde in Not!

Erfahren Sie, wie Sie Ihre Laravel-Anwendung in wenigen Minuten mandantenfähig machen

In diesem Tutorial verwenden wir das

Tenancy for Laravel-Paket, um Multi-Tenancy für Laravel-Anwendungen zu implementieren.

Es handelt sich um ein Multi-Tenant-Paket, das es Ihrer Laravel-Anwendung ermöglicht, Multi-Tenant zu sein,

ohne dass zusätzlicher Code geschrieben werden muss. Es ist genauso Plug-and-Play wie ein Mietpaket.

Randnotiz: In diesem Tutorial behandeln wir die gängigste Einrichtung – Multi-Datenbank-Mandantenfähigkeit auf mehreren Domänen. Sollten Sie ein anderes Setup benötigen, ist dies zu 100 % möglich. Schauen Sie sich einfach das Paket an.

Wie es funktioniert

Das Besondere an diesem Paket ist, dass es Sie nicht dazu zwingt, Ihre Bewerbung auf eine bestimmte Art und Weise zu verfassen. Sie können Ihre Anwendung so schreiben, wie Sie es gewohnt sind, und unter der Haube wird automatisch Mandantenfähigkeit generiert. Sie können Pakete sogar in bestehende Anwendungen integrieren.

So funktioniert es:

1. Wenn der Server eine Benutzeranfrage empfängt

2. Das Programm kann anhand der Anfrage erkennen, zu welchem ​​Mandanten die Anfrage gehört. (Über den Hauptdomänennamen, den Subdomänennamen, den Pfad, den Anforderungsheader, die Abfrageparameter usw.)
3. Das Programm wechselt vom
Standard-Datenbanklink zum aktuellen Mandantenlink. 4. Alle Datenbankaufrufe, Cache-Aufrufe, Warteschlangenaufrufe und andere Vorgänge werden automatisch dem Mandanten und dem Switch zugeordnet.

Installation

Der erste Schritt besteht darin, das Paket über Composer zu installieren. Der Befehl lautet wie folgt:

composer require stancl/tenancy
Nach dem Login kopieren
Führen Sie dann den Befehl

wie folgt aus: tenancy:install

php artisan tenancy:install
Nach dem Login kopieren
Der Vorgang erzeugt die folgenden Dateien: Migrationsdateien, Konfigurationsdateien, Routingdateien und einen Dienstanbieter.

Lassen Sie uns die Datenbank einrichten und die Datenbankmigration mit dem folgenden Befehl durchführen:

php artisan migrate
Nach dem Login kopieren
Dann registrieren Sie den Dienstanbieter in

. Stellen Sie sicher, dass Sie den Code an der folgenden Stelle platzieren:config/app.php

/*
 * Application Service Providers...
 */
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
App\Providers\TenancyServiceProvider::class, // <-- 放于此处
Nach dem Login kopieren

Jetzt erstellen wir ein benutzerdefiniertes Mandantenmodell. Das Paket unterliegt keinen Einschränkungen. Um eine separate Datenbank und Domäne zu verwenden, müssen wir ein leicht angepasstes Mandantenmodell erstellen. Erstellen Sie eine

-Datei mit dem folgenden Code: app/Tenant.php

<?php

namespace App;

use Stancl\Tenancy\Database\Models\Tenant as BaseTenant;
use Stancl\Tenancy\Contracts\TenantWithDatabase;
use Stancl\Tenancy\Database\Concerns\HasDatabase;
use Stancl\Tenancy\Database\Concerns\HasDomains;

class Tenant extends BaseTenant implements TenantWithDatabase
{
    use HasDatabase, HasDomains;
}
Nach dem Login kopieren

Jetzt weisen wir das Paket an, dieses Modell mit Mietern zu verwenden:

// config/tenancy.php file

&#39;tenant_model&#39; => \App\Tenant::class,
Nach dem Login kopieren
Zwei Teile

Das Paket wird Ihnen bereitgestellt Die Anwendung wird als zwei separate Teile behandelt:

    Zentrale Anwendung – hostet die Anmeldeseite, möglicherweise ein zentrales Dashboard zur Verwaltung von Mietern usw.
  • Mandantenanwendung – Dies ist der verwendete Teil durch Ihre Mieter. Hier befindet sich höchstwahrscheinlich der Großteil der Geschäftslogik
Teilen Sie die Anwendung auf

Nachdem wir diese beiden Teile verstanden haben, teilen wir die Anwendung entsprechend auf.

Zentrale App

Stellen wir zunächst sicher, dass die zentrale App nur in der zentralen Domäne zugänglich ist.

Gehen Sie zu

und stellen Sie sicher, dass Ihre app/Providers/RouteServiceProvider.php- und web-Routen nur auf der zentralen Domäne geladen werden: api

protected function mapWebRoutes()
{
    foreach ($this->centralDomains() as $domain) {
        Route::middleware('web')
            ->domain($domain)
            ->namespace($this->namespace)
            ->group(base_path('routes/web.php'));
    }
}

protected function mapApiRoutes()
{
    foreach ($this->centralDomains() as $domain) {
        Route::prefix('api')
            ->domain($domain)
            ->middleware('api')
            ->namespace($this->namespace)
            ->group(base_path('routes/api.php'));
    }
}

protected function centralDomains(): array
{
    return config('tenancy.central_domains');
}
Nach dem Login kopieren
Gehen Sie nun zu Ihrer Datei

und fügen Sie tatsächlich zentral hinzu Domain. config/tenancy.php

Ich verwende Valet, daher ist für mich die zentrale Domäne

und die Mandantendomänen sind beispielsweise saas.test und foo.saas.test. bar.saas.test

Also legen wir den

Schlüssel fest: central_domains

'central_domains' => [
    'saas.test', // Add the ones that you use. I use this one with Laravel Valet.
],
Nach dem Login kopieren
Mieter-App

Jetzt kommt der spaßige Teil. Dieser Teil ist fast zu einfach.

Um Code mandantenfähig zu machen, müssen Sie nur Folgendes tun:

    Migrationen in das Verzeichnis
  • verschieben tenant/
  • Routen nach Routing-Datei
  • tenant.php
  • Das war's.

Durch die Migration in diesen bestimmten Ordner und das Einfügen einer Route in diese bestimmte Routendatei wird das Paket benachrichtigt, das den Mandanten auf dieser Route identifiziert.

Wenn Sie eine bestehende Anwendung haben, tun Sie dies mit Ihrem Code. Wenn Sie eine brandneue Anwendung verwenden, folgen Sie bitte dem folgenden Beispiel:

Standardmäßig sehen Ihre Mandantenrouten so aus:

Route::middleware([
    'web',
    InitializeTenancyByDomain::class,
    PreventAccessFromCentralDomains::class,
])->group(function () {
    Route::get('/', function () {
        return 'This is your multi-tenant application. The id of the current tenant is ' . tenant('id');
    });
});
Nach dem Login kopieren

Diese Routen können nur im Mandanten (nicht) verwendet werden -hub)-Domäne Beim Zugriff – die

-Middleware erzwingt dies.

PreventAccessFromCentralDomains Nehmen wir eine kleine Änderung vor, um alle Benutzer in der Datenbank zu speichern, damit wir tatsächlich sehen können, dass die Mehrmandantenfähigkeit funktioniert. Fügen Sie dies zur Middleware-Gruppe hinzu:

Route::get('/', function () {
    dd(\App\User::all());
    return 'This is your multi-tenant application. The id of the current tenant is ' . tenant('id');
});
Nach dem Login kopieren

Jetzt migrieren. Verschieben Sie einfach die Migrationen im Zusammenhang mit der Mandantenanwendung in das Verzeichnis

.

因此,对于我们的示例:要使用户进入租户数据库,让我们将users表迁移移至数据库/迁移/租户。这将防止在中央数据库中创建表,而是在创建租户时在租户数据库中创建表。

尝试一下

现在让我们创建一些租户。

我们还没有可供租户注册的登录页面,但是我们可以在修补程序中创建他们!

因此,让我们打开php artisan tinker并创建一些租户。租户实际上只是模型,因此您可以像其他任何Eloquent模型一样创建它们。

请注意,我们在 这里使用域标识因此,请确保您使用的域指向您的应用程序。我正在使用代客,所以我正在*.saas.test用于租户。如果使用php artisan serve,则可以使用foo.localhost

    >> $tenant1 = Tenant::create(['id' => 'foo']);
    >> $tenant1->domains()->create(['domain' => 'foo.saas.test']);
>>>
    >> $tenant2 = Tenant::create(['id' => 'bar']);
    >> $tenant2->domains()->create(['domain' => 'bar.saas.test']);
Nach dem Login kopieren

现在,我们将在每个租户的数据库中创建一个用户:

App\Tenant::all()->runForEach(function () {
    factory(App\User::class)->create();
});
Nach dem Login kopieren

就是这样-  我们有一个多租户应用程序!

如果您访问  foo.saas.test (或与您的环境相当),则会看到用户转储。

如果访问bar.saas.test,您将看到不同用户的转储  。数据库是100%分离的,我们使用的代码 —App\User::all()— 根本不需要了解租约!这一切都会在后台自动发生。您只需像以前那样编写应用程序,而不必考虑自己的范围界定,并且一切都正常。

当然,现在,租户应用程序中将有一个更复杂的应用程序。仅转储用户的SaaS可能用处不大。这就是您的工作-编写将由租户使用的业务逻辑。包装将处理其余部分。

不过,Tenancy for Laravel  项目的帮助并没有到此结束。该软件包将为您完成与多租户相关的所有繁重工作。但是,如果您要构建SaaS,则仍然需要自己编写计费逻辑,入门流程和类似的标准内容。如果您有兴趣,该项目还提供了一个优质产品:multi-tenant SaaS boilerplate。它旨在通过为您提供通常需要编写的SaaS功能来节省您的时间。所有这些都打包在一个随时可以部署的多租户应用程序中。

原文地址:https://laravel-news.com/multi-tenant

译文地址:https://learnku.com/laravel/t/47951

Das obige ist der detaillierte Inhalt vonErfahren Sie, wie Sie Ihre Laravel-Anwendung in wenigen Minuten mandantenfähig machen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage