Tenancy for Laravel-Paket, um Multi-Tenancy für Laravel-Anwendungen zu implementieren.
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.
composer require stancl/tenancy
wie folgt aus: tenancy:install
php artisan tenancy:install
php artisan migrate
. 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, // <-- 放于此处
-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; }
// config/tenancy.php file 'tenant_model' => \App\Tenant::class,
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'); }
und fügen Sie tatsächlich zentral hinzu Domain. config/tenancy.php
und die Mandantendomänen sind beispielsweise saas.test
und foo.saas.test
. bar.saas.test
Schlüssel fest: central_domains
'central_domains' => [ 'saas.test', // Add the ones that you use. I use this one with Laravel Valet. ],
tenant/
tenant.php
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'); }); });
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'); });
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']);
现在,我们将在每个租户的数据库中创建一个用户:
App\Tenant::all()->runForEach(function () { factory(App\User::class)->create(); });
就是这样- 我们有一个多租户应用程序!
如果您访问 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!