真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

使Laravel應(yīng)用擁有多租戶功能的示例

這篇文章給大家分享的是有關(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ù)邏輯都存在的地方

拆分應(yīng)用

了解了這兩個(gè)部分,讓我們將應(yīng)用進(jìn)行相應(yīng)的拆分。

Central app

首先讓我們確保 central 應(yīng)用僅在中心域上可訪問。

轉(zhuǎn)到 app/Providers/RouteServiceProvider.php,并確保您的 webapi 路由僅在中央域上加載:

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.testbar.saas.test 為例。

因此,我們設(shè)置 central_domains 鍵:

'central_domains' => [
    'saas.test', // Add the ones that you use. I use this one with Laravel Valet.
],

Tenant app

現(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ò),可以把它分享出去讓更多的人看到吧!


當(dāng)前文章:使Laravel應(yīng)用擁有多租戶功能的示例
網(wǎng)頁鏈接:http://weahome.cn/article/igsops.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部