0

0

laravel如何实现一个多租户架构的应用_Laravel多租户架构实现方法

下次还敢

下次还敢

发布时间:2025-10-10 18:21:02

|

1001人浏览过

|

来源于php中文网

原创

Laravel多租户核心是通过统一入口识别租户并保持请求周期上下文一致,常用方式包括独立数据库隔离、共享库加tenant_id字段隔离。2. 独立数据库通过中间件解析子域名切换连接,数据最安全;共享数据库则用全局作用域自动添加tenant_id条件,成本低。3. 路由结合中间件处理租户识别,推荐子域名方案。4. 文件存储需按租户隔离路径,可配置自定义磁盘实现。5. 方案选择取决于安全要求与运维能力,共享库适合中小项目,独立库适合大型系统。

laravel如何实现一个多租户架构的应用_laravel多租户架构实现方法

在 Laravel 中实现多租户架构,核心是让一个应用支持多个独立的客户(租户),每个租户的数据相互隔离。常见的隔离方式包括共享数据库、分表隔离或独立数据库。下面介绍几种实用且可扩展的实现方式。

1. 数据库级别隔离:每个租户独立数据库

这种方式最安全,数据完全隔离。适合对数据安全性要求高的场景。

实现思路:

  • 用户登录时识别租户(如通过子域名或请求头)
  • 动态切换数据库连接
  • 使用中间件设置当前租户的数据库配置

示例代码:

在中间件中根据子域名切换数据库:

class IdentifyTenant
{
    public function handle($request, Closure $next)
    {
        $host = $request->getHost();
        $subdomain = explode('.', $host)[0];

        $tenant = Tenant::where('subdomain', $subdomain)->first();

        if (! $tenant) {
            abort(404, '租户不存在');
        }

        Config::set('database.connections.tenant.database', $tenant->database_name);
        DB::purge('tenant'); // 清除连接缓存
        DB::reconnect('tenant'); // 重新连接

        app()->instance('currentTenant', $tenant);

        return $next($request);
    }
}

模型查询时使用 tenant 连接:

User::on('tenant')->get();

2. 共享数据库 + 租户字段隔离

所有租户共用一张数据库,每张业务表增加 tenant_id 字段进行区分。成本低,维护方便。

关键点:

  • 全局作用域自动添加 tenant_id 条件
  • 确保所有查询都受租户限制

定义全局作用域:

class TenantScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $tenant = app('currentTenant');
        if ($tenant) {
            $builder->where($model->getTable() . '.tenant_id', $tenant->id);
        }
    }
}

在模型中启用:

华锐行业电子商务系统
华锐行业电子商务系统

华锐行业电子商务系统2.0采用微软最新的.net3.5(c#)+mssql架构,代码进行全面重整及优化,清除冗余及垃圾代码,运行速度更快、郊率更高。全站生成静态、会员二级域名、竞价排名、企业会员有多套模板可供选择;在界面方面采用DIV+CSS进行设计,实现程序和界面分离,方便修改适合自己的个性界面,在用户体验方面,大量使用ajax技术,更加易用。程序特点:一、采用微软最新.net3.5+MSSQL

下载

class Post extends Model
{
    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope(new TenantScope);
    }
}

3. 路由与租户识别

常见识别方式有子域名、路径前缀、请求头等。推荐使用子域名结合中间件处理。

路由配置:

Route::middleware('identify-tenant')->group(function () {
    Route::get('/dashboard', [DashboardController::class, 'index']);
    Route::resource('posts', PostController::class);
});

identify-tenant 绑定到自定义中间件,完成租户解析和上下文设置。

4. 文件与资源隔离

上传文件也需按租户隔离,避免混淆。

建议做法:

  • 存储路径加入租户标识:storage/app/tenants/{tenant_id}/files
  • 使用自定义磁盘配置

配置 filesystems.php

'tenant' => [
    'driver' => 'local',
    'root' => storage_path('app/tenants/' . app('currentTenant')->id),
],

上传时使用:Storage::disk('tenant')->put(...)

基本上就这些。Laravel 多租户的关键在于统一入口识别租户,并在整个请求生命周期中保持上下文一致。选择哪种隔离方式取决于业务规模、安全要求和运维能力。共享数据库+字段隔离适合中小型项目,独立数据库适合大型企业级系统。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2677

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1659

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1515

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1419

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1235

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1488

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

3

2026.01.19

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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号