多租戶系統(tǒng)是那些需要在一套后端程序上同時(shí)維護(hù)多個(gè)客戶的 web 開發(fā)者的福音。
Spatie 發(fā)布的一個(gè) Laravel 的擴(kuò)展 multitenancy ,該擴(kuò)展主要幫助您快速搭建多租戶系統(tǒng):
laravel-multitenancy 擴(kuò)展發(fā)布地址:t.co/q9HzfkNw7w
該擴(kuò)展理念是提供您實(shí)現(xiàn)多租戶的基本要素。文檔: t.co/zspuLyt3KN
視頻演示 (案例): t.co/i3QzTezcuY pic.twitter.com/cy2Fk4tIe6
— Freek Van der Herten (@freekmurze) May 20, 2020
根據(jù) Freek Van der Herten 的介紹文章:introductory post,可以了解到該擴(kuò)展僅僅是提供用戶實(shí)現(xiàn)多租戶系統(tǒng)的基本要素。
你可以從該擴(kuò)展獲取以下便利:
判斷當(dāng)前是哪個(gè)租戶。
租戶配置的級(jí)聯(lián)更改。
創(chuàng)建新租戶數(shù)據(jù)庫,并在租戶間的數(shù)據(jù)遷移工具。
詳細(xì)介紹以及使用方法請(qǐng)看具體文檔:laravel-multitenancy documenation.
租戶模型
該擴(kuò)展的核心是: Tenant
模型,該模型用于租戶實(shí)例的創(chuàng)建,您可以通過該擴(kuò)展提供的一些遍歷方法快速使用和訪問當(dāng)前租戶。
use Spatie\Multitenancy\Models\Tenant; // 獲取當(dāng)前租戶,不存在返回 null Tenant::current() // 通過容器的方式獲取當(dāng)前租戶 app('currentTenant'); // 確認(rèn)當(dāng)前是否有租戶 Tenant::checkCurrent() // 將某個(gè)租戶設(shè)置為當(dāng)前租戶 $tenant->makeCurrent(); // 忘記當(dāng)前租戶 Tenant::forgetCurrent();
查詢租戶客戶
在安裝該擴(kuò)展之后,在數(shù)據(jù)庫中你會(huì)發(fā)現(xiàn) tenants
數(shù)據(jù)表,該表用于存儲(chǔ)租戶信息。該擴(kuò)展實(shí)現(xiàn)了一些便利的方法,包括通過域名來確定當(dāng)前租戶,其中 DomainTenantFinder
類,就是用于查詢并設(shè)置當(dāng)前租戶。當(dāng)然,你也可以配置自定義查詢方式,只要實(shí)現(xiàn) TenantFinder
抽象類即可。
在查找租戶時(shí)您可能還需要考慮一些必要判定。該擴(kuò)展提供了一些租戶判定的中間件,比如根據(jù)入?yún)泶_定并設(shè)置當(dāng)前所屬租戶的中間件 NeedsTenant
,以及防止非當(dāng)前租戶的用戶訪問的 EnsureValidTenantSession
全局中間件。
Tenant-Aware 控制臺(tái)和隊(duì)列
多租戶系統(tǒng)還需要考慮的問題就是:控制臺(tái)命令和隊(duì)列范圍的界定。默認(rèn)情況下,隊(duì)列的執(zhí)行與否是不會(huì)會(huì)根據(jù)租戶來做區(qū)分的,該擴(kuò)展中,您可以通過配置 TenantAware
和 NotTenantAware
參數(shù)來實(shí)現(xiàn)特定租戶可以使用特定隊(duì)列的需求。
當(dāng)然,您也可以通過 tenants:artisan
命令來實(shí)現(xiàn)在特定租戶下執(zhí)行遷移的需求,案例如下:
# 所有租戶執(zhí)行遷移 php artisan tenants:artisan migrate # 特定租戶執(zhí)行遷移 php artisan tenants:artisan "migrate --seed" --tenant=123
## 更多知識(shí)
關(guān)于擴(kuò)展的使用以及安裝,請(qǐng)閱讀 spatie/laravel-multitenancy.
想要了解更多細(xì)節(jié)請(qǐng)閱讀 Freek’s post。