教你在幾分鐘內讓Laravel應用程式擁有多租戶功能
在本教學中,我們將使用 Tenancy for Laravel package
讓Laravel 應用實作多租戶。不需要重寫額外程式碼。它就像租賃包一樣即插即用。
工作原理
這個套件的獨特之處在於它不會強迫您以特定的方式編寫應用程式。你可以像你習慣的那樣編寫你的應用程序,它會在後台自動生成多租戶。您甚至可以將套件整合到現有的應用程式中。 以下是它的工作原理:
1.當伺服器接收到使用者請求
2.程式便可以透過請求識別該請求屬於哪個租用戶。 (透過主網域,子網域,路徑,請求頭,query 參數,等)3.程式將會從
default資料庫連結切換為目前租用戶連結。
4.任意的資料庫調用,快取調用,佇列調用,等操作都會自動匹配租用戶並切換。
安裝
第一步,透過composer 安裝package,指令如下:
composer require stancl/tenancy
然後,執行 tenancy:install
指令,如下:
php artisan tenancy:install
此操作會產生以下文件:遷移文件,設定文件,路由文件和一個服務提供者。
下面讓我們把資料庫建立起來,透過以下指令執行資料庫遷移:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">php artisan migrate</pre><div class="contentsignin">登入後複製</div></div>
然後在
註冊服務提供者。請確定將程式碼放於以下位置:
/* * 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 檔案:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"><?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><div class="contentsignin">登入後複製</div></div>
現在,我們告訴程式包將該模型用於tenants:
// config/tenancy.php file 'tenant_model' => \App\Tenant::class,
兩個部分軟體包將您的應用程式視為兩個獨立的部分:
- 拆分應用程式
- 了解了這兩個部分,讓我們將應用程式進行相應的拆分。
- Central app
首先讓我們確保 central 應用程式僅在中心網域上可存取。
轉到
app/Providers/RouteServiceProvider.php,並確保您的
web和
api 路由僅在中央網域上載入:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">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');
}</pre><div class="contentsignin">登入後複製</div></div>
現在轉到您的檔案config/tenancy.php
,實際新增中心域。 我使用的是Valet,所以對我來說,中心域是
,租戶網域以foo.saas.test
和
為例。 因此,我們設定
central_domains
鍵:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">'central_domains' => [
'saas.test', // Add the ones that you use. I use this one with Laravel Valet.
],</pre><div class="contentsignin">登入後複製</div></div>
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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel9和CodeIgniter4的最新版本提供了更新的功能和改進。 Laravel9採用MVC架構,提供資料庫遷移、驗證及模板引擎等功能。 CodeIgniter4採用HMVC架構,提供路由、ORM和快取。在性能方面,Laravel9的基於服務提供者設計模式和CodeIgniter4的輕量級框架使其具有出色的性能。在實際應用中,Laravel9適用於需要靈活性和強大功能的複雜項目,而CodeIgniter4適用於快速開發和小型應用程式。

比較Laravel和CodeIgniter的資料處理能力:ORM:Laravel使用EloquentORM,提供類別物件關係映射,而CodeIgniter使用ActiveRecord,將資料庫模型表示為PHP類別的子類別。查詢建構器:Laravel具有靈活的鍊式查詢API,而CodeIgniter的查詢建構器更簡單,基於陣列。資料驗證:Laravel提供了一個Validator類,支援自訂驗證規則,而CodeIgniter的驗證功能內建較少,需要手動編碼自訂規則。實戰案例:用戶註冊範例展示了Lar

Laravel - Artisan 指令 - Laravel 5.7 提供了處理和測試新指令的新方法。它包括測試 artisan 命令的新功能,下面提到了演示?

對於初學者來說,CodeIgniter的學習曲線更平緩,功能較少,但涵蓋了基本需求。 Laravel提供了更廣泛的功能集,但學習曲線稍陡。在性能方面,Laravel和CodeIgniter都表現出色。 Laravel有更廣泛的文件和活躍的社群支持,而CodeIgniter更簡單、輕量級,具有強大的安全功能。在建立部落格應用程式的實戰案例中,Laravel的EloquentORM簡化了資料操作,而CodeIgniter需要更多的手動配置。

在選擇大型專案框架時,Laravel和CodeIgniter各有優勢。 Laravel針對企業級應用程式而設計,提供模組化設計、相依性注入和強大的功能集。 CodeIgniter是一款輕量級框架,更適合小型到中型項目,強調速度和易用性。對於具有複雜需求和大量用戶的大型項目,Laravel的強大功能和可擴展性更為合適。而對於簡單專案或資源有限的情況下,CodeIgniter的輕量級和快速開發能力則較為理想。

微服務架構使用PHP框架(如Symfony和Laravel)來實現微服務,並遵循RESTful原則和標準資料格式來設計API。微服務透過訊息佇列、HTTP請求或gRPC進行通信,並使用工具(如Prometheus和ELKStack)進行監控和故障排除。

對於小型項目,Laravel適用於大型項目,需要強大的功能和安全性。 CodeIgniter適用於非常小的項目,需要輕量級和易用性。

比較了Laravel的Blade和CodeIgniter的Twig模板引擎,根據專案需求和個人偏好進行選擇:Blade基於MVC語法,鼓勵良好程式碼組織和模板繼承。 Twig是第三方函式庫,提供靈活語法、強大過濾器、擴充支援和安全沙箱。
