首頁  >  文章  >  php框架  >  教你在幾分鐘內讓Laravel應用程式擁有多租戶功能

教你在幾分鐘內讓Laravel應用程式擁有多租戶功能

藏色散人
藏色散人轉載
2020-08-01 13:25:384857瀏覽

在本教學中,我們將使用 Tenancy for Laravel package

讓Laravel 應用實作多租戶。

教你在幾分鐘內讓Laravel應用程式擁有多租戶功能

它是一個多租戶軟體包,讓你的Laravel應用程式實現多租戶 

不需要重寫額外程式碼。它就像租賃包一樣即插即用。

附註:在本教學中,我們將介紹最常見的設定-多個網域上的多資料庫租賃。如果你需要一個不同的設置,這是100%可能的。只需查看文件包。

工作原理

這個套件的獨特之處在於它不會強迫您以特定的方式編寫應用程式。你可以像你習慣的那樣編寫你的應用程序,它會在後台自動生成多租戶。您甚至可以將套件整合到現有的應用程式中。

以下是它的工作原理:

1.當伺服器接收到使用者請求

2.程式便可以透過請求識別該請求屬於哪個租用戶。 (透過主網域,子網域,路徑,請求頭,query 參數,等)

3.程式將會從 

default

 資料庫連結切換為目前租用戶連結。

4.任意的資料庫調用,快取調用,佇列調用,等操作都會自動匹配租用戶並切換。


安裝
第一步,透過composer 安裝package,指令如下:

composer require stancl/tenancy

然後,執行 tenancy:install

指令,如下:

php artisan tenancy:install

此操作會產生以下文件:遷移文件,設定文件,路由文件和一個服務提供者。

下面讓我們把資料庫建立起來,透過以下指令執行資料庫遷移:<pre class="brush:php;toolbar:false">php artisan migrate</pre>然後在 

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

現在,我們建立一個自訂的 tenant 模型。該程式包是不受限制的,因此要使用單獨的資料庫和網域,我們需要建立一個略微自訂的 tenant 模型。使用以下程式碼建立一個

app/Tenant.php

檔案:<pre class="brush:php;toolbar:false">&lt;?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>現在,我們告訴程式包將該模型用於tenants:

// config/tenancy.php file

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

兩個部分軟體包將您的應用程式視為兩個獨立的部分:

central 應用程式- 承載登入頁面,可能是管理tenants 的中央儀表板等

tenant 應用程式- 這是您的使用者(tenants) 使用的部分。這很可能是大多數業務邏輯都存在的地方

    拆分應用程式
  • 了解了這兩個部分,讓我們將應用程式進行相應的拆分。
  • Central app

首先讓我們確保 central 應用程式僅在中心網域上可存取。

轉到

app/Providers/RouteServiceProvider.php

,並確保您的

web

api

路由僅在中央網域上載入:<pre class="brush:php;toolbar:false">protected function mapWebRoutes() {     foreach ($this-&gt;centralDomains() as $domain) {         Route::middleware('web')             -&gt;domain($domain)             -&gt;namespace($this-&gt;namespace)             -&gt;group(base_path('routes/web.php'));     } } protected function mapApiRoutes() {     foreach ($this-&gt;centralDomains() as $domain) {         Route::prefix('api')             -&gt;domain($domain)             -&gt;middleware('api')             -&gt;namespace($this-&gt;namespace)             -&gt;group(base_path('routes/api.php'));     } } protected function centralDomains(): array {     return config('tenancy.central_domains'); }</pre>現在轉到您的檔案config/tenancy.php,實際新增中心域。 我使用的是Valet,所以對我來說,中心域是

saas.test

,租戶網域以foo.saas.test

bar .saas.test

為例。 因此,我們設定 central_domains 鍵:<pre class="brush:php;toolbar:false">'central_domains' =&gt; [     'saas.test', // Add the ones that you use. I use this one with Laravel Valet. ],</pre>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');
    });
});

這些路由只能在tenant (非中心) 網域上訪問—

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中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除