目录
✅1。选择您的多租户策略
✅2。设置子域路由
✅3。创建一个中间件来处理租户身份证
✅4。租户数据库管理
✅5。模型组织
✅6。跨租户的用户身份验证
✅7。开发和测试技巧
✅8。安全与最佳实践
最后笔记
首页 php框架 Laravel 如何在Laravel中创建多租户应用程序?

如何在Laravel中创建多租户应用程序?

Aug 02, 2025 pm 03:53 PM

选择强大数据隔离的每个租户数据库策略。 2。使用{tenant}的Laravel域路由设置子域路由。 3。创建识别量中间件以从子域中提取租户,验证数据库存在,然后将默认连接切换到租户的数据库。 4。在bernel.php中注册中间件,并在config/database.php中配置动态“租户”数据库连接。 5。使用Artisan Commant createtenant自动化数据库创建,迁移和每个租户的种子。 6.通过扩展使用“租户”连接的租户特定数据的租户模型来组织模型。 7.通过会话或令牌共享(例如Sanctum,JWT)通过中央域处理身份验证,以允许在子域中无缝访问。 8。在开发过程中,使用Laravel代客或主机文件条目模拟诸如acme.test之类的子域。 9。通过验证租户输入,使用参数绑定和记录租户上下文来实施安全性。 10。单独备份租户数据库,并仅在需要时考虑使用诸如stancl/租赁之类的软件包进行缩放。核心流量为:子域→房客ID→开关DB→路线→服务,确保完全隔离和控制。

如何在Laravel中创建多租户应用程序?

在Laravel中创建多租户应用程序意味着从单个代码库中为多个客户端(租户)提供服务,同时保持数据隔离。根据您的需求,有不同的方法 - 与租户标识符共享数据库,每个租户单独的数据库甚至混合模型。以下是使用子域路由的每个数据库方法构建多租户Laravel应用程序的实用指南。

如何在Laravel中创建多租户应用程序?

✅1。选择您的多租户策略

在编码之前,请确定您如何隔离租户数据:

战略 优点 缺点
带tenant_id的单DB 简单,简单的备份 数据泄漏的风险如果查询未范围
每个租户单独的DB 强烈的隔离 更复杂的数据库管理
每个租户架构(PostgreSQL) 良好的平衡 仅限于Postgresql

对于本指南,我们将使用一个由子域确定的每个租户数据库(例如, acme.yourapp.comdb_acme )。

如何在Laravel中创建多租户应用程序?

✅2。设置子域路由

使用Laravel的路线子域支持来识别租户。

routes/web.phproutes/tenant.php中:

如何在Laravel中创建多租户应用程序?
路由:: middleware('tenant') - > group(function(){
    路由:: get('/',function(){
        返回视图('tenant.dashboard');
    });

    路由:: get('/profile',function(){
        返回视图('tenant.profile');
    });
});

RouteServiceProvider中使用通配符子域注册该路线:

 route :: domain('{pent} .yourapp.com') - > group(base_path('routes/tenant.php'));

用您的实际域替换yourapp.com (在开发过程中使用Laravel代客或自定义主机等工具使用localhost )。


✅3。创建一个中间件来处理租户身份证

创建中间件: php artisan make:middleware IdentifyTenant

命名空间应用\ http \ middleware;

使用闭合;
使用Illuminate \ support \ aftades \ db;
使用Illuminate \ support \ aftades \ app;
使用Symfony \ Component \ httpkernel \ exception \ notfoundHttpexception;

班级识别者
{
    公共功能句柄($请求,关闭$ next)
    {
        $ tenant = $ request-> route('租户');

        如果(!$租户){
            中止(400,“未指定租户”。);
        }

        //检查房客DB是否存在
        $ dbname =“房客_ {$ tenant}”;
        $ config = config('database.connections.mysql');
        $ config ['database'] = $ dbname;

        尝试 {
            DB ::连接('tenant') - > setDatabaseName($ dbName);
            db ::连接('tenant') - > getpdo(); //测试连接
        } catch(\异常$ e){
            抛出新的NotFoundHttPexception(“找不到租户:{$ tenant}”);
        }

        //全球使用租户连接用于模型
        config :: set('database.default','tenant');

        //可选:共享租户信息
        查看::共享('Currentenant',$ $租户);

        返回$ next($请求);
    }
}

app/Http/Kernel.php中注册中间件:

受保护的$ middlewaregroups = [
    '租户'=> [
        \ app \ http \ middleware \ sideentenant :: class,
    ],,
];

另外,在config/database.php中定义新的DB连接:

 '租户'=> [
    '驱动程序'=>'mysql',
    'host'=> env('db_host','127.0.0.1'),
    'port'=> env('db_port','3306'),
    '数据库'=> null,//将动态设置
    '用户名'=> env('db_username'),
    '密码'=> env('db_password'),
    'charset'=>'utf8mb4',
    'Collation'=>'UTF8MB4_UNICODE_CI',
    '前缀'=>'',
],,

✅4。租户数据库管理

您需要一种创建和播种租户数据库的方法。

创建命令: php artisan make:command CreateTenant

 namespace app \ console \ commands;

使用Illuminate \ Console \ command;
使用Illuminate \ support \ aftades \ db;
使用Illuminate \ support \ aftades \ schema;

类肌肉扩展命令
{
    受保护的$签名='租户:创建{subdomain}';
    保护$ description ='创建具有自己数据库的新租户';

    公共功能句柄()
    {
        $ subdoain = $ this->参数('subdomain');
        $ dbName =“租户_ {$ subdomain}”;

        //创建数据库
        db ::语句(“创建数据库,如果不存在`{$ dbName}``'');

        //在租户DB上运行迁移
        $ this->呼叫('迁移',[
            ' -  database'=>'房客',
            ' -  path'=>'数据库/迁移/租户',
            ' -  force'=> true,
        );

        //可选的种子
        $ this->呼叫('db:seed',[
            ' -  database'=>'房客',
            ' -  class'=>'tenantdatabaseseeder',
            ' -  force'=> true,
        );

        $ this-> info(“使用db:{$ dbName}”成功创建的租户{$ subdomain}”);
    }
}

运行它:

 PHP工匠租户:创建ACME

将特定于租户的迁移保留在database/migrations/tenant/中。


✅5。模型组织

对特定于租户的模型使用基本模型:

名称空间应用\ models \ tenant;

使用Illuminate \ Database \ Eloquent \ Model;

类TenantModel扩展模型
{
    受保护的$ Connection ='租户'; //使用租户DB
}

然后,租户模型将其扩展:

班级产品扩展了tenantmodel
{
    //使用租户数据库
}

对于中央模型(用户,计费),请保持默认连接。


✅6。跨租户的用户身份验证

如果用户通过中央域( app.com )和访问acme.app.com登录,您将需要:

  • 中央登录系统
  • 会话或基于令牌的租户子域的交接
  • 可能是JWT或通过REDIS共享的会话

或者,使用Laravel Sanctum或Passport进行基于API的身份验证。

提示:如果使用单个DB,则将tenant_id存储在用户表中,或通过中央DB和房客协会管理用户访问。


✅7。开发和测试技巧

  • 使用laravel/valetvalet park和诸如acme.test之类的域名
  • 或编辑/etc/hosts
     127.0.0.1 acme.yourapp.test
    127.0.0.1 beta.yourapp.test
  • 使用单独的.env或配置进行测试租户

  • ✅8。安全与最佳实践

    • 始终验证租户输入(不要从路线上{tenant}
    • 消毒数据库名称
    • 避免不绑定的原始查询
    • 调试的日志租户上下文
    • 单独备份租户数据库

    最后笔记

    多租期增加了复杂性。启动简单:

    • 如果强隔离并不关键,则将单个DB与tenant_id使用
    • 仅在需要时切换到租户DB
    • 考虑诸如先进用例的stancl/租赁等软件包(支持DB,存储,队列,Redis隔离)

    但是,如果您想完全控制和学习,上面的手动方法可以清楚地表达清晰度和灵活性。

    基本上,它是关于:子域→租户ID→开关DB→路由→服务

    以上是如何在Laravel中创建多租户应用程序?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何在Laravel中实施推荐系统? 如何在Laravel中实施推荐系统? Aug 02, 2025 am 06:55 AM

创建referrals表记录推荐关系,包含推荐人、被推荐人、推荐码及使用时间;2.在User模型中定义belongsToMany和hasMany关系以管理推荐数据;3.用户注册时生成唯一推荐码(可通过模型事件实现);4.注册时通过查询参数捕获推荐码,验证后建立推荐关系并防止自荐;5.当被推荐用户完成指定行为(如下单)时触发奖励机制;6.生成可分享的推荐链接,可使用Laravel签名URL增强安全性;7.在仪表板展示推荐统计信息,如总推荐数和已转化数;必须确保数据库约束、会话或Cookie持久化、

如何在Laravel雄辩中使用访问者和突变器? 如何在Laravel雄辩中使用访问者和突变器? Aug 02, 2025 am 08:32 AM

conscortorSandMutatorsInlaravel'SeloquentormallowyOutoFormAtormanIpulateModeModeLattributesWhenRetRievorvingOrstTingValues.1.useaccessorstocustomizeattributeretributeretrieval,sueascaScapapitalizingfirst_namevirst_nameviagetFirstnameAtTeameAtTeameAtTeameAtTeameAtTeameAttribute($ value)($ value)

Laravel的存储库合同是什么? Laravel的存储库合同是什么? Aug 03, 2025 am 12:10 AM

Repository模式是一种设计模式,用于解耦业务逻辑与数据访问逻辑。1.它通过接口(Contract)定义数据访问方法;2.具体操作由Repository类实现;3.控制器通过依赖注入使用接口,不直接接触数据源;4.优势包括代码整洁、可测试性强、便于维护和团队协作;5.适用于中大型项目,小型项目可直接使用模型。

如何在Laravel雄辩中使用子征服? 如何在Laravel雄辩中使用子征服? Aug 05, 2025 am 07:53 AM

laravelleloquentsuportsubqueriesInSelect,从哪里,andorderbyClauses启用Feflexibledataretievalwithoutrawsql; 1.UseselectSub()toaddcompentedColumnSlumnsLikePostCountCountCountCountCountPeruser; 2.Usefromsub; 2.usefromsub; 2.Usefromsub orclosolusoblesoblesoboledInfom()

如何与Laravel创建一个宁静的API? 如何与Laravel创建一个宁静的API? Aug 02, 2025 pm 12:31 PM

创建Laravel项目并配置数据库环境;2.使用Artisan生成模型、迁移和控制器;3.在api.php中定义API资源路由;4.实现控制器中的增删改查方法并使用请求验证;5.安装LaravelSanctum实现API认证并保护路由;6.统一JSON响应格式并处理错误;7.使用Postman等工具测试API,最终得到一个功能完整、可扩展的RESTfulAPI。

如何与Laravel从头开始建立博客? 如何与Laravel从头开始建立博客? Aug 02, 2025 am 10:16 AM

安装并创建Laravel项目,使用composercreate-project命令初始化blog项目并启动开发服务器;2.配置数据库,在.env文件中设置MySQL连接信息并创建blog数据库;3.创建Post模型和迁移文件,定义title、content、slug、is_published等字段并执行迁移;4.生成PostController资源控制器,在index方法中查询已发布的文章并分页显示;5.使用Blade模板引擎创建布局和视图文件,包括文章列表和详情页面;6.在web.php中注册

如何将Laravel品脱用于代码样式? 如何将Laravel品脱用于代码样式? Aug 02, 2025 pm 01:35 PM

laravelpintisazero-configurationCodestyLefixerthatautopationallicationalforcesconsistentphpCodingStandards,尤其是InlaravelApplications.2.itcomespre-Installedwithlaravel9和Canbeinbeinstalledwithlaravel9和CanbeinStalledInstalledInStallerStallEdinerSornOlderVersionsOrnOlderVersionsOrnonOrlavelProjectSssssSssSerserComerquropoSerrequire-DevlarareRequire-DevllalRarav

如何通过Laravel收银员处理重复的付款? 如何通过Laravel收银员处理重复的付款? Aug 06, 2025 pm 01:38 PM

InstallLaravelCashierviaComposerandconfiguremigrationandBillabletrait.2.CreatesubscriptionplansinStripeDashboardandnoteplanIDs.3.CollectpaymentmethodusingStripeCheckoutandstoreitviasetupintent.4.SubscribeusertoaplanusingnewSubscription()anddefaultpay

See all articles