如今数据库对于这个时代的我们来说,并不陌生了吧。最近,一个新的数据库项目显示,经过身份验证的用户属于特定租户,应仅允许其从自己的数据库中提取数据。本文是实现数据库多租户这一目标的方法。本文将选择了以提供简单测试代码为起点的策略,并使它逐层工作。它提供了具有测试,迁移和特定于租户的小功能的完整解决方案。
1.每个故事都始于测试:PostsTest
让测试驱动我的代码成为了我的激情。多租户不应有所不同。首先,我们确定我们希望测试的外观,然后使代码发生。
这是一个非常简单且公平的测试。为了使其工作,首要要求是TenantTestCase设置租户。但是在深入探讨之前,让我们快速编写我们的create助手。
2.TenantTestCase
通过测试,我们可以预期TenantTestCase该类将负责创建一个新公司,一个新用户并对该用户进行身份验证。还应设置特定于数据库的连接。
通过使用RefreshDatabase,应该自动迁移主数据库。调用actingAs将建立身份验证。至于用户工厂,由于用户属于公司,因此应递归解决该依赖关系。
3.工厂
该UserFactory会负责为我们创建新用户。Laravel的默认UserFactory几乎足够好,我们只需要向其中添加company_id字段即可。
一旦需要创建新用户,Laravel将尝试解析CompanyFactory。让我们接下来写。
这CompanyFactory是一家新公司通过我们的测试而生的时刻,因此我决定利用它来按期望的那样自动设置承租人数据库连接PostsTest。
最后一个工厂是PostFactory。出于组织目的,我决定将所有主要工厂迁入database/factories/main并为的租户工厂腾出空间database/factories/tenant。PostFactory非常简单。
4. tenant_connect()和tenant_migrate()帮助器
顾名思义,tenant_connect()它将与租户数据库建立数据库连接。由于这是测试阶段,因此我们应确保租户数据库接收到它自己的迁移,例如posts表。
该文件可以放在下database/helpers.php。不要忘记将其添加到作曲家自动加载中。
“ autoload”:{
“ classmap”:[
“数据库/种子”,
“数据库/工厂”
],
“文件”:[
“ database / helpers.php”
],
“ psr .4”:{
“ App \”: “ app /”
}
}
这将我们带入下一个主题:迁移。
5.主要迁移
默认的database / migrations文件夹将保存主要连接的数据库结构。我们需要创建“ 公司”迁移并调整“ 用户”以适应某个company_id字段。
使用名称手动创建公司迁移2014_10_12_000000_create_companies_table.php会将其放置在users迁移之前,这将防止任何外键冲突,因为要创建用户表的公司表应该已经存在。
6.租户迁移
在第(3)项中,我们建立了一种tenant_migrate()方法,该方法将使用文件夹database/migrations_tenant作为承租人数据库结构的源。让我们create_posts_table在那里创建迁移。
至此,所有必要的迁移就结束了。接下来,我们需要处理应用程序数据库设置和模型的连接。
7.应用程序数据库设置
对于数据库连接,让我们重用上一篇文章中应用的相同策略:a main和tenant数据库。特别注意指向的新默认连接main。另一个有趣的地方是DB_DRIVER变量,它将允许我们在测试和实时应用程序之间在SQLite和MySQL之间进行切换。
因为我们在谈论数据库设置,所以让我们花点时间设置phpunit.xml文件。该文件应包含这些变量
<env name =“ DB_DRIVER” value =“ sqlite” />
<env name =“ DB_CONNECTION” value =“ main” />
<env name =“ DB_DATABASE” value =“:内存:” />
8.模型
还需要在租户模型和主要模型之间划分模型。让我们在名称空间下创建MainModel和TenantModelApp/Models。
主连接上的表应该扩展MainModel,而“ Posts”表是特定于客户的数据库结构的一部分,并且应该扩展TenantModel。就个人而言,我分别使用命名空间AppModelsMain和AppModelsTenant。
9.路线
由于本文的重点是谈论租期,所以我们不要浪费时间谈论路由。测试现在应该通过。
10.总结
我们从创建帖子的测试开始,然后点击一个端点以查看是否返回。但是在执行测试之前,将调用setUpon方法TenantTestCase。
租户测试用例类将创建一个用户,该用户属于公司。在创建该公司的过程中,将建立一个新的数据库连接,并通过tenant_migrate()助手进行迁移。完成所有这些操作后,“承租人测试用例”类将拥有一个经过身份验证的用户。
一旦/posts端点被调用,已创建了一个用户数据库和已建立连接。通过使用Post具有默认连接的模型,该模型tenant将自动从连接的数据库中获取记录。
所有这些使我们成功实施了测试。但是实际应用呢?
11.租户中间件
测试为绿色,但实际的应用程序无法正常工作。这样做的原因是因为测试正在建立租户连接,但应用程序却没有。我们可以通过实现租户中间件来解决这个问题。
上述就是关于数据库多租户最终指南的全部内容,想了解更多关于数据库的信息,请继续关注中培伟业。