ホームページ >PHPフレームワーク >Laravel >数分でLaravelアプリケーションをマルチテナントにする方法を教えます

数分でLaravelアプリケーションをマルチテナントにする方法を教えます

藏色散人
藏色散人転載
2020-08-01 13:25:384864ブラウズ

次のチュートリアルコラムでは、ララの作り方を紹介します。 vel アプリケーションは数分でマルチテナント機能を備えています。困っている友人の役に立てば幸いです。

このチュートリアルでは、

Tenancy for Laravel パッケージ数分でLaravelアプリケーションをマルチテナントにする方法を教えますを使用して、Laravel アプリケーションをマルチテナントにします。

これは、Laravel アプリケーションをマルチテナントにすることができるマルチテナント ソフトウェア パッケージです。追加のコードをコピーする必要はありません
。レンタル パッケージと同じようにプラグ アンド プレイです。

補足: このチュートリアルでは、最も一般的なセットアップである複数のドメイン上のマルチデータベース テナントについて説明します。別のセットアップが必要な場合、これは 100% 可能です。パッケージをチェックしてみてください。

仕組み

このパッケージのユニークな点は、アプリケーションを特定の方法で書くことを強制しないことです。使い慣れた方法でアプリケーションを作成すると、内部でマルチテナントが自動的に生成されます。パッケージを既存のアプリケーションに統合することもできます。

その仕組みは次のとおりです:

1. サーバーがユーザー リクエストを受信したとき

2. プログラムは、リクエストを通じてそのリクエストがどのテナントに属しているかを識別できます。 (メイン ドメイン名、サブドメイン名、パス、リクエスト ヘッダー、クエリ パラメーターなどを通じて)

3. プログラムは、

default

データベース リンクから現在のテナント リンクに切り替えます。
4. データベース呼び出し、キャッシュ呼び出し、キュー呼び出し、その他の操作は、テナントとスイッチに自動的に照合されます。
インストール
最初のステップは、composer を介してパッケージをインストールすることです。コマンドは次のとおりです:

composer require stancl/tenancy

次に、

tenancy:install

を実行します。

php artisan tenancy:install

この操作により、移行ファイル、構成ファイル、ルーティング ファイル、サービス プロバイダーのファイルが生成されます。 次のコマンドを使用してデータベースをセットアップし、データベースの移行を実行します:

php artisan migrate

次に、サービス プロバイダーを

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, // <-- 放于此处

次に、カスタム テナント モデルを作成します。パッケージには制限がないため、別のデータベースとドメインを使用するには、わずかにカスタマイズしたテナント モデルを作成する必要があります。次のコードを使用して 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;
}

ここで、テナントにこのモデルを使用するようにパッケージに指示します: <pre class="brush:php;toolbar:false">// config/tenancy.php file &amp;#39;tenant_model&amp;#39; =&gt; \App\Tenant::class,</pre>2 つの部分 <p>パッケージは、アプリケーションを 2 つの別個の部分として扱います: </p> <h2></h2>中央アプリケーション - ログイン ページ、場合によってはテナントを管理するための中央ダッシュボードなどをホストします。<p></p>テナント アプリケーション - これテナントが使用する部分です。これは、ほとんどのビジネス ロジックが存在する場所であると考えられます。<ul> <li>アプリケーションの分割<li>これら 2 つの部分を理解したので、それに応じてアプリケーションを分割しましょう。 </ul> <h2>セントラル アプリ</h2> <p>まず、セントラル アプリがセントラル ドメインでのみアクセスできることを確認しましょう。 </p> <h3></h3>app/Providers/RouteServiceProvider.php<p> に移動し、</p>web<p> および <code>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');
}
次に、ファイル config/tenancy.php に移動し、実際にセントラル ドメインを追加します。 私は Valet を使用しているため、セントラル ドメインは

saas.test で、テナント ドメインは foo.saas.test

および

bar です。 saas.test は一例です。 そこで、central_domains キーを設定します。

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

ここからが楽しい部分です。この部分はほとんど簡単すぎます。

一部のコードをテナント対応にするには、次の手順を実行するだけです:

移行を

tenant/

ディレクトリに移動します

    ルートを
  • tenant.php ルーティング ファイル
  • に移動するだけです。 その特定のフォルダーに移行し、その特定のルート ファイルにルートを含めると、そのルート上のテナントを識別するパッケージに通知されます。
既存のアプリケーションがある場合は、コードを使用してこれを実行します。新しいアプリケーションを使用している場合は、次の例に従ってください:

デフォルトでは、テナント ルートは次のようになります:

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');
    });
});
これらのルートはテナント (非ハブ)ドメイン アクセス -

PreventAccessFromCentralDomains

ミドルウェアによってこれが強制されます。

実際にマルチテナンシーが機能していることを確認できるように、データベース内のすべてのユーザーをダンプする小さな変更を加えてみましょう。これをミドルウェア グループに追加します:

Route::get('/', function () {
    dd(\App\User::all());
    return 'This is your multi-tenant application. The id of the current tenant is ' . tenant('id');
});
さて、移行します。テナント アプリケーションに関連する移行を 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

以上が数分でLaravelアプリケーションをマルチテナントにする方法を教えますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。