La colonne tutorielle suivante deLaravelvous présentera comment faire en sorte que les applications Laravel aient des fonctions multi-locataires en quelques minutes. amis dans le besoin !
Dans ce tutoriel, nous utiliserons lePackage Tenancy for Laravelpour implémenter la multi-tenancy pour les applications Laravel.
C'est un package multi-tenant qui permet à votre application Laravel d'être multi-tenantsans avoir à écrire de code supplémentaire. C'est aussi plug-and-play qu'un forfait de location.
Remarque : dans ce didacticiel, nous aborderons la configuration la plus courante : la location multi-bases de données sur plusieurs domaines. Si vous avez besoin d'une configuration différente, c'est 100% possible. Il suffit de consulter le package.
Ce qui est unique dans ce package, c'est qu'il ne vous oblige pas à rédiger votre candidature d'une manière spécifique. Vous pouvez écrire votre application comme vous en avez l'habitude et elle générera automatiquement une multi-location sous le capot. Vous pouvez même intégrer des packages dans des applications existantes.
Voici comment cela fonctionne :
1. Lorsque le serveur reçoit une demande d'utilisateur
2. Le programme peut identifier à quel locataire appartient la demande via la demande. (Par le nom de domaine principal, le nom de sous-domaine, le chemin, l'en-tête de requête, les paramètres de requête, etc.)
3. Le programme passera du lien de base de donnéespar défautau lien de locataire actuel.
4. Tous les appels de base de données, appels de cache, appels de file d'attente et autres opérations correspondront automatiquement au locataire et au commutateur.
La première étape consiste à installer le package via composer, la commande est la suivante :
composer require stancl/tenancy
Ensuite, exécutez la commandetenancy:install
comme suit :
php artisan tenancy:install
L'opération produira les fichiers suivants : des fichiers de migration, des fichiers de configuration, des fichiers de routage et un fournisseur de services.
Configurons la base de données et effectuons la migration de la base de données via la commande suivante :
php artisan migrate
Enregistrez ensuite le fournisseur de services dansconfig/app.php
. Assurez-vous de placer le code à l'emplacement suivant :
/* * 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, // <-- 放于此处
Maintenant, créons un modèle de locataire personnalisé. Le package n'est pas connecté, donc pour utiliser une base de données et un domaine distincts, nous devons créer un modèle de locataire légèrement personnalisé. Créez unapp/Tenant.php
fichier avec le code suivant :
Copier après la connexion
Maintenant, nous disons au package d'utiliser ce modèle avec les locataires :
// config/tenancy.php file 'tenant_model' => \App\Tenant::class,
Le package vous donnera L'application est traitée comme deux parties distinctes :
Maintenant que ces deux parties sont comprises, divisons l'application en conséquence.
Assurons-nous d'abord que l'application centrale n'est accessible que sur le domaine central.
Allez surapp/Providers/RouteServiceProvider.php
et assurez-vous que vos routesweb
etapi
ne sont chargées que sur le domaine central :
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'); }
Maintenant, allez dans votre fichierconfig/tenancy.php
et ajoutez réellement central domaine.
J'utilise Valet, donc pour moi le domaine central estsaas.test
et les domaines locataires sontfoo.saas.test
etbar.saas.test
par exemple.
Donc, nous définissons la touchecentral_domains
:
'central_domains' => [ 'saas.test', // Add the ones that you use. I use this one with Laravel Valet. ],
Vient maintenant la partie amusante. Cette partie est presque trop facile.
Pour rendre certains codes tenant compte des locataires, il vous suffit de procéder comme suit :
tenant/
tenant.php
Fichier de routageVoilà.
La migration dans ce dossier spécifique et l'inclusion d'une route dans ce fichier de route spécifique informeront le package qui identifie le locataire sur cette route.
Si vous avez une application existante, faites-le en utilisant votre code. Si vous utilisez une toute nouvelle application, veuillez suivre l'exemple suivant :
Par défaut, vos routes locataires ressembleront à ceci :
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'); }); });
Ces routes ne peuvent être utilisées que dans le locataire (non -hub) domaine Lors de l'accès - le middlewarePreventAccessFromCentralDomains
appliquera cela.
Apportons un petit changement pour supprimer tous les utilisateurs de la base de données afin que nous puissions réellement voir le fonctionnement de la multi-location. Ajoutez ceci au groupe middleware :
Route::get('/', function () { dd(\App\User::all()); return 'This is your multi-tenant application. The id of the current tenant is ' . tenant('id'); });
Maintenant, migrez. Déplacez simplement les migrations liées à l’application locataire dans le répertoiredatabase/migrations/tenant
.
因此,对于我们的示例:要使用户进入租户数据库,让我们将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
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!