您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關使Laravel應用擁有多租戶功能的示例的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
在本教程中,我們將使用 Tenancy for Laravel package讓Laravel 應用實現多租戶。
它是一個多租戶軟件包,讓你的Laravel應用程序實現多租戶 不需要復寫額外代碼。 它就像租賃包一樣即插即用。
旁注:在本教程中,我們將介紹最常見的設置-多個域上的多數據庫租賃。如果你需要一個不同的設置,這是100%可能的。只需查看文件包。
這個包的獨特之處在于它不會強迫您以特定的方式編寫應用程序。你可以像你習慣的那樣編寫你的應用程序,它會在后臺自動生成多租戶。您甚至可以將包集成到現有的應用程序中。
以下是它的工作原理:
1.當服務器接收到用戶請求
2.程序便可以通過請求識別該請求屬于哪個租戶。(通過主域名,子域名,路徑,請求頭,query 參數,等)
3.程序將會從 default 數據庫鏈接切換為當前租戶鏈接。
4.任意的數據庫調用,緩存調用,隊列調用,等操作都會自動匹配租戶并切換。
第一步,通過 composer 安裝 package,命令如下:
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, // <-- 放于此處
現在,我們創建一個自定義的 tenant 模型。該程序包是不受限制的,因此要使用單獨的數據庫和域,我們需要創建一個略微定制的 tenant 模型。使用以下代碼創建一個 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; }
現在,我們告訴程序包將該模型用于 tenants:
// config/tenancy.php file 'tenant_model' => \App\Tenant::class,
軟件包將您的應用程序視為兩個獨立的部分:
central 應用程序 —— 承載登錄頁面,可能是管理 tenants 的中央儀表板等
tenant 應用程序 —— 這是您的用戶 (tenants) 使用的部分。這很可能是大多數業務邏輯都存在的地方
了解了這兩個部分,讓我們將應用進行相應的拆分。
首先讓我們確保 central 應用僅在中心域上可訪問。
轉到 app/Providers/RouteServiceProvider.php
,并確保您的 web
和 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/
目錄
將路由移動到 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功能來節省您的時間。所有這些都打包在一個隨時可以部署的多租戶應用程序中。
感謝各位的閱讀!關于“使Laravel應用擁有多租戶功能的示例”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。