在本教學中,我們將使用 Tenancy for Laravel package
讓Laravel 應用實作多租戶。 它是一個多租戶軟體包,讓你的Laravel應用程式實現多租戶不需要重寫額外程式碼。它就像租賃包一樣即插即用。
工作原理
這個套件的獨特之處在於它不會強迫您以特定的方式編寫應用程式。你可以像你習慣的那樣編寫你的應用程序,它會在後台自動生成多租戶。您甚至可以將套件整合到現有的應用程式中。 以下是它的工作原理:
3.程式將會從
default資料庫連結切換為目前租用戶連結。
4.任意的資料庫調用,快取調用,佇列調用,等操作都會自動匹配租用戶並切換。
安裝
第一步,透過composer 安裝package,指令如下:
composer require stancl/tenancy
php artisan tenancy:install
此操作會產生以下文件:遷移文件,設定文件,路由文件和一個服務提供者。
下面讓我們把資料庫建立起來,透過以下指令執行資料庫遷移:<pre class="brush:php;toolbar:false">php artisan migrate</pre>
然後在
註冊服務提供者。請確定將程式碼放於以下位置:
/* * 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 檔案:<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>
現在,我們告訴程式包將該模型用於tenants:
// config/tenancy.php file 'tenant_model' => \App\Tenant::class,
兩個部分軟體包將您的應用程式視為兩個獨立的部分:
轉到
app/Providers/RouteServiceProvider.php和
api 路由僅在中央網域上載入:<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>
現在轉到您的檔案config/tenancy.php
,實際新增中心域。 我使用的是Valet,所以對我來說,中心域是
,租戶網域以foo.saas.test
和
為例。 因此,我們設定
central_domains
鍵:<pre class="brush:php;toolbar:false">'central_domains' => [
'saas.test', // Add the ones that you use. I use this one with Laravel Valet.
],</pre>
Tenant app
現在是有趣的部分。這一部分幾乎太簡單了。 要使某些程式碼具有租用戶意識,您只需執行以下操作:
tenant/
目錄#將路由移到
在該特定資料夾中進行遷移並且在該特定路由檔案中包含路由將通知包標識該路由上的租用戶。
預設情況下,您的租用戶路由如下所示:
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中文網其他相關文章!