如何在Laravel中创建多租户应用程序?
选择强大数据隔离的每个租户数据库策略。 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应用程序的实用指南。

✅1。选择您的多租户策略
在编码之前,请确定您如何隔离租户数据:
战略 | 优点 | 缺点 |
---|---|---|
带tenant_id的单DB | 简单,简单的备份 | 数据泄漏的风险如果查询未范围 |
每个租户单独的DB | 强烈的隔离 | 更复杂的数据库管理 |
每个租户架构(PostgreSQL) | 良好的平衡 | 仅限于Postgresql |
对于本指南,我们将使用一个由子域确定的每个租户数据库(例如, acme.yourapp.com
→ db_acme
)。

✅2。设置子域路由
使用Laravel的路线子域支持来识别租户。
在routes/web.php
或routes/tenant.php
中:

路由:: 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/valet
与valet park
和诸如acme.test
之类的域名 - 或编辑
/etc/hosts
:127.0.0.1 acme.yourapp.test 127.0.0.1 beta.yourapp.test
- 使用单独的
.env
或配置进行测试租户 - 始终验证租户输入(不要从路线上
{tenant}
) - 消毒数据库名称
- 避免不绑定的原始查询
- 调试的日志租户上下文
- 单独备份租户数据库
- 如果强隔离并不关键,则将单个DB与
tenant_id
使用 - 仅在需要时切换到租户DB
- 考虑诸如先进用例的stancl/租赁等软件包(支持DB,存储,队列,Redis隔离)
✅8。安全与最佳实践
最后笔记
多租期增加了复杂性。启动简单:
但是,如果您想完全控制和学习,上面的手动方法可以清楚地表达清晰度和灵活性。
基本上,它是关于:子域→租户ID→开关DB→路由→服务。
以上是如何在Laravel中创建多租户应用程序?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undress AI Tool
免费脱衣服图片

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

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

Clothoff.io
AI脱衣机

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

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

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

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

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

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

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

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

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

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