Maison  >  Article  >  cadre php  >  Vous apprendre à rendre votre application Laravel multi-tenant en quelques minutes

Vous apprendre à rendre votre application Laravel multi-tenant en quelques minutes

藏色散人
藏色散人avant
2020-08-01 13:25:384800parcourir

La colonne tutorielle suivante de Laravel vous présentera comment faire en sorte que les applications Laravel aient des fonctions multi-locataires en quelques minutes. amis dans le besoin !

Vous apprendre à rendre votre application Laravel multi-tenant en quelques minutes

Dans ce tutoriel, nous utiliserons le Package Tenancy for Laravel pour implémenter la multi-tenancy pour les applications Laravel.

C'est un package multi-tenant qui permet à votre application Laravel d'être multi-tenant sans 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.

Comment ça marche

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ées par défaut au 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.

Installation

La première étape consiste à installer le package via composer, la commande est la suivante :

composer require stancl/tenancy

Ensuite, exécutez la commande tenancy: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 dans config/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 un app/Tenant.php fichier avec le code suivant :

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

Maintenant, nous disons au package d'utiliser ce modèle avec les locataires :

// config/tenancy.php file

&#39;tenant_model&#39; => \App\Tenant::class,

Deux parties

Le package vous donnera L'application est traitée comme deux parties distinctes :

  • application centrale - héberge la page de connexion, éventuellement un tableau de bord central pour gérer les locataires, etc.
  • application locataire - c'est la partie utilisée par vos locataires. C'est très probablement là que réside l'essentiel de la logique métier

Diviser l'application

Maintenant que ces deux parties sont comprises, divisons l'application en conséquence.

Application centrale

Assurons-nous d'abord que l'application centrale n'est accessible que sur le domaine central.

Allez sur app/Providers/RouteServiceProvider.php et assurez-vous que vos routes web et api 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 fichier config/tenancy.php et ajoutez réellement central domaine.

J'utilise Valet, donc pour moi le domaine central est saas.test et les domaines locataires sont foo.saas.test et bar.saas.test par exemple.

Donc, nous définissons la touche central_domains :

'central_domains' => [
    'saas.test', // Add the ones that you use. I use this one with Laravel Valet.
],

Application locataire

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 :

  • Déplacer les migrations vers le répertoire tenant/
  • Déplacer les routes vers tenant.php Fichier de routage

Voilà.

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 middleware PreventAccessFromCentralDomains 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épertoire database/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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer