0

0

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

藏色散人

藏色散人

发布时间:2020-08-01 13:25:38

|

5129人浏览过

|

来源于learnku

转载

下面由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

'tenant_model' => \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 路由文件

就是这样。

Krea AI
Krea AI

多功能的一站式AI图像生成和编辑平台

下载

在该特定文件夹中进行迁移并且在该特定路由文件中包含路由将通知包标识该路由上的租户。

如果您有现有的应用程序,请使用您的代码执行此操作。如果您使用的是全新应用,请按照以下示例操作:

默认情况下,您的租户路由如下所示:

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

38

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

83

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

97

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

223

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

458

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

169

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

246

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

34

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号