這篇文章給大家分享的是有關(guān)使Laravel應(yīng)用擁有多租戶功能的示例的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、成都微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了柳江免費(fèi)建站歡迎大家使用!
在本教程中,我們將使用 Tenancy for Laravel package讓Laravel 應(yīng)用實(shí)現(xiàn)多租戶。
它是一個(gè)多租戶軟件包,讓你的Laravel應(yīng)用程序?qū)崿F(xiàn)多租戶 不需要復(fù)寫額外代碼。 它就像租賃包一樣即插即用。
旁注:在本教程中,我們將介紹最常見的設(shè)置-多個(gè)域上的多數(shù)據(jù)庫租賃。如果你需要一個(gè)不同的設(shè)置,這是100%可能的。只需查看文件包。
這個(gè)包的獨(dú)特之處在于它不會強(qiáng)迫您以特定的方式編寫應(yīng)用程序。你可以像你習(xí)慣的那樣編寫你的應(yīng)用程序,它會在后臺自動(dòng)生成多租戶。您甚至可以將包集成到現(xiàn)有的應(yīng)用程序中。
以下是它的工作原理:
1.當(dāng)服務(wù)器接收到用戶請求
2.程序便可以通過請求識別該請求屬于哪個(gè)租戶。(通過主域名,子域名,路徑,請求頭,query 參數(shù),等)
3.程序?qū)?default數(shù)據(jù)庫鏈接切換為當(dāng)前租戶鏈接。
4.任意的數(shù)據(jù)庫調(diào)用,緩存調(diào)用,隊(duì)列調(diào)用,等操作都會自動(dòng)匹配租戶并切換。
第一步,通過 composer 安裝 package,命令如下:
composer require stancl/tenancy
然后,執(zhí)行 tenancy:install
命令,如下:
php artisan tenancy:install
該操作會產(chǎn)生以下文件:遷移文件,配置文件,路由文件和一個(gè)服務(wù)提供者。
下面讓我們把數(shù)據(jù)庫建立起來,通過以下命令執(zhí)行數(shù)據(jù)庫遷移:
php artisan migrate
然后在 config/app.php
注冊服務(wù)提供者。請確定將代碼放于以下位置:
/* * 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, // <-- 放于此處
現(xiàn)在,我們創(chuàng)建一個(gè)自定義的 tenant 模型。該程序包是不受限制的,因此要使用單獨(dú)的數(shù)據(jù)庫和域,我們需要?jiǎng)?chuàng)建一個(gè)略微定制的 tenant 模型。使用以下代碼創(chuàng)建一個(gè) app/Tenant.php
文件:
現(xiàn)在,我們告訴程序包將該模型用于 tenants:
// config/tenancy.php file 'tenant_model' => \App\Tenant::class,兩個(gè)部分
軟件包將您的應(yīng)用程序視為兩個(gè)獨(dú)立的部分:
central 應(yīng)用程序 —— 承載登錄頁面,可能是管理 tenants 的中央儀表板等
tenant 應(yīng)用程序 —— 這是您的用戶 (tenants) 使用的部分。這很可能是大多數(shù)業(yè)務(wù)邏輯都存在的地方
了解了這兩個(gè)部分,讓我們將應(yīng)用進(jìn)行相應(yīng)的拆分。
首先讓我們確保 central 應(yīng)用僅在中心域上可訪問。
轉(zhuǎn)到 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'); }
現(xiàn)在轉(zhuǎn)到您的文件 config/tenancy.php
,實(shí)際添加中心域。
我使用的是 Valet,所以對我來說,中心域是 saas.test
,租戶域以 foo.saas.test
和bar.saas.test
為例。
因此,我們設(shè)置 central_domains
鍵:
'central_domains' => [ 'saas.test', // Add the ones that you use. I use this one with Laravel Valet. ],
現(xiàn)在是有趣的部分。這一部分幾乎太簡單了。
要使某些代碼具有租戶意識,您只需執(zhí)行以下操作:
將遷移移動(dòng)到 tenant/
目錄
將路由移動(dòng)到 tenant.php
路由文件
就是這樣。
在該特定文件夾中進(jìn)行遷移并且在該特定路由文件中包含路由將通知包標(biāo)識該路由上的租戶。
如果您有現(xiàn)有的應(yīng)用程序,請使用您的代碼執(zhí)行此操作。如果您使用的是全新應(yīng)用,請按照以下示例操作:
默認(rèn)情況下,您的租戶路由如下所示:
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
中間件會強(qiáng)制執(zhí)行這一點(diǎn)。
讓我們做一點(diǎn)小更改以轉(zhuǎn)儲數(shù)據(jù)庫中的所有用戶,以便我們可以實(shí)際看到多租戶工作。將此添加到中間件組:
Route::get('/', function () { dd(\App\User::all()); return 'This is your multi-tenant application. The id of the current tenant is ' . tenant('id'); });
現(xiàn)在,遷移。只需將與租戶應(yīng)用程序相關(guān)的遷移移動(dòng)到database/migrations/tenant
目錄中即可。
因此,對于我們的示例:要使用戶進(jìn)入租戶數(shù)據(jù)庫,讓我們將users表遷移移至數(shù)據(jù)庫/遷移/租戶。這將防止在中央數(shù)據(jù)庫中創(chuàng)建表,而是在創(chuàng)建租戶時(shí)在租戶數(shù)據(jù)庫中創(chuàng)建表。
現(xiàn)在讓我們創(chuàng)建一些租戶。
我們還沒有可供租戶注冊的登錄頁面,但是我們可以在修補(bǔ)程序中創(chuàng)建他們!
因此,讓我們打開php artisan tinker
并創(chuàng)建一些租戶。租戶實(shí)際上只是模型,因此您可以像其他任何Eloquent模型一樣創(chuàng)建它們。
請注意,我們在 這里使用域標(biāo)識因此,請確保您使用的域指向您的應(yīng)用程序。我正在使用代客,所以我正在*.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']);
現(xiàn)在,我們將在每個(gè)租戶的數(shù)據(jù)庫中創(chuàng)建一個(gè)用戶:
App\Tenant::all()->runForEach(function () { factory(App\User::class)->create(); });
就是這樣- 我們有一個(gè)多租戶應(yīng)用程序!
如果您訪問 foo.saas.test
(或與您的環(huán)境相當(dāng)),則會看到用戶轉(zhuǎn)儲。
如果訪問bar.saas.test
,您將看到不同用戶的轉(zhuǎn)儲 。數(shù)據(jù)庫是100%分離的,我們使用的代碼 —App\User::all()
— 根本不需要了解租約!這一切都會在后臺自動(dòng)發(fā)生。您只需像以前那樣編寫應(yīng)用程序,而不必考慮自己的范圍界定,并且一切都正常。
當(dāng)然,現(xiàn)在,租戶應(yīng)用程序中將有一個(gè)更復(fù)雜的應(yīng)用程序。僅轉(zhuǎn)儲用戶的SaaS可能用處不大。這就是您的工作-編寫將由租戶使用的業(yè)務(wù)邏輯。包裝將處理其余部分。
不過,Tenancy for Laravel 項(xiàng)目的幫助并沒有到此結(jié)束。該軟件包將為您完成與多租戶相關(guān)的所有繁重工作。但是,如果您要構(gòu)建SaaS,則仍然需要自己編寫計(jì)費(fèi)邏輯,入門流程和類似的標(biāo)準(zhǔn)內(nèi)容。如果您有興趣,該項(xiàng)目還提供了一個(gè)優(yōu)質(zhì)產(chǎn)品:multi-tenant SaaS boilerplate。它旨在通過為您提供通常需要編寫的SaaS功能來節(jié)省您的時(shí)間。所有這些都打包在一個(gè)隨時(shí)可以部署的多租戶應(yīng)用程序中。
感謝各位的閱讀!關(guān)于“使Laravel應(yīng)用擁有多租戶功能的示例”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!