搜索
首页php框架Laravel教你在几分钟内使Laravel应用拥有多租户功能

下面由Laravel教程栏目给大家介绍在几分钟内使Laravel应用拥有多租户功能的方法,希望对需要的朋友有所帮助!

教你在几分钟内使Laravel应用拥有多租户功能

在本教程中,我们将使用 Tenancy for Laravel package让Laravel 应用实现多租户。

它是一个多租户软件包,让你的Laravel应用程序实现多租户 不需要复写额外代码。 它就像租赁包一样即插即用。

旁注:在本教程中,我们将介绍最常见的设置-多个域上的多数据库租赁。如果你需要一个不同的设置,这是100%可能的。只需查看文件包。

工作原理

这个包的独特之处在于它不会强迫您以特定的方式编写应用程序。你可以像你习惯的那样编写你的应用程序,它会在后台自动生成多租户。您甚至可以将包集成到现有的应用程序中。

以下是它的工作原理:

1.当服务器接收到用户请求
2.程序便可以通过请求识别该请求属于哪个租户。(通过主域名,子域名,路径,请求头,query 参数,等)
3.程序将会从 default 数据库链接切换为当前租户链接。
4.任意的数据库调用,缓存调用,队列调用,等操作都会自动匹配租户并切换。

安装

第一步,通过 composer 安装 package,命令如下:

composer require stancl/tenancy

然后,执行 tenancy:install 命令,如下:

php artisan tenancy:install

该操作会产生以下文件:迁移文件,配置文件,路由文件和一个服务提供者。

下面让我们把数据库建立起来,通过以下命令执行数据库迁移:

php artisan migrate

然后在 config/app.php注册服务提供者。请确定将代码放于以下位置:

/*
 * 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 文件:

<?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;
}

现在,我们告诉程序包将该模型用于 tenants:

// config/tenancy.php file

&#39;tenant_model&#39; => \App\Tenant::class,

两个部分

软件包将您的应用程序视为两个独立的部分:

  • central 应用程序 —— 承载登录页面,可能是管理 tenants 的中央仪表板等
  • tenant 应用程序 —— 这是您的用户 (tenants) 使用的部分。这很可能是大多数业务逻辑都存在的地方

拆分应用

了解了这两个部分,让我们将应用进行相应的拆分。

Central app

首先让我们确保 central 应用仅在中心域上可访问。

转到 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');
}

现在转到您的文件 config/tenancy.php,实际添加中心域。

我使用的是 Valet,所以对我来说,中心域是 saas.test,租户域以 foo.saas.testbar.saas.test 为例。

因此,我们设置 central_domains 键:

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

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中文网其他相关文章!

声明
本文转载于:learnku。如有侵权,请联系admin@php.cn删除
Laravel的多功能性:从简单站点到复杂系统Laravel的多功能性:从简单站点到复杂系统Apr 13, 2025 am 12:13 AM

选择Laravel开发项目是因为其灵活性和强大功能适应不同规模和复杂度的需求。Laravel提供路由系统、EloquentORM、Artisan命令行等功能,支持从简单博客到复杂企业级系统的开发。

Laravel(PHP)与Python:开发环境和生态系统Laravel(PHP)与Python:开发环境和生态系统Apr 12, 2025 am 12:10 AM

Laravel和Python在开发环境和生态系统上的对比如下:1.Laravel的开发环境简单,仅需PHP和Composer,提供了丰富的扩展包如LaravelForge,但扩展包维护可能不及时。2.Python的开发环境也简单,仅需Python和pip,生态系统庞大,涵盖多个领域,但版本和依赖管理可能复杂。

Laravel和后端:为Web应用程序提供动力逻辑Laravel和后端:为Web应用程序提供动力逻辑Apr 11, 2025 am 11:29 AM

Laravel是如何在后端逻辑中发挥作用的?它通过路由系统、EloquentORM、认证与授权、事件与监听器以及性能优化来简化和增强后端开发。1.路由系统允许定义URL结构和请求处理逻辑。2.EloquentORM简化数据库交互。3.认证与授权系统便于用户管理。4.事件与监听器实现松耦合代码结构。5.性能优化通过缓存和队列提高应用效率。

为什么Laravel如此受欢迎?为什么Laravel如此受欢迎?Apr 02, 2025 pm 02:16 PM

Laravel受欢迎的原因包括其简化开发过程、提供愉快的开发环境和丰富的功能。1)它吸收了RubyonRails的设计理念,结合PHP的灵活性。2)提供了如EloquentORM、Blade模板引擎等工具,提高开发效率。3)其MVC架构和依赖注入机制使代码更加模块化和可测试。4)提供了强大的调试工具和性能优化方法,如缓存系统和最佳实践。

django或laravel哪个更好?django或laravel哪个更好?Mar 28, 2025 am 10:41 AM

Django和Laravel都是全栈框架,Django适合Python开发者和复杂业务逻辑,Laravel适合PHP开发者和优雅语法。1.Django基于Python,遵循“电池齐全”哲学,适合快速开发和高并发。2.Laravel基于PHP,强调开发者体验,适合小型到中型项目。

哪个是更好的PHP或Laravel?哪个是更好的PHP或Laravel?Mar 27, 2025 pm 05:31 PM

PHP和Laravel不是直接可比的,因为Laravel是基于PHP的框架。1.PHP适合小型项目或快速原型开发,因其简单直接。2.Laravel适合大型项目或高效开发,因其提供丰富功能和工具,但学习曲线较陡,性能可能不如纯PHP。

Laravel是前端还是后端?Laravel是前端还是后端?Mar 27, 2025 pm 05:31 PM

laravelisabackendframeworkbuiltonphp,设计ForweBapplicationDevelopment.itfocusessonserver-sideLogic,databasemagemention和Applicationstructure和CanBeintegratedWithFrontendTechnologiesLikeLikeVue.jsorreActeReacterVue.jsorreActforforfull-stackDevefloct。

如何在Laravel中创建和使用自定义刀片指令?如何在Laravel中创建和使用自定义刀片指令?Mar 17, 2025 pm 02:50 PM

本文讨论了Laravel中的创建和使用自定义刀片指令以增强模板。它涵盖了定义指令,在模板中使用它们,并在大型项目中管理它们,强调了改进的代码可重复性和R等好处

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境