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