最新公告
  • 欢迎您光临AA分享网,一个高级程序员的学习、分享的分享平台!立即加入我们
  • 数据库多租户最终指南

    如今数据库对于这个时代的我们来说,并不陌生了吧。最近,一个新的数据库项目显示,经过身份验证的用户属于特定租户,应仅允许其从自己的数据库中提取数据。本文是实现数据库多租户这一目标的方法。本文将选择了以提供简单测试代码为起点的策略,并使它逐层工作。它提供了具有测试,迁移和特定于租户的小功能的完整解决方案。

      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.租户中间件

    测试为绿色,但实际的应用程序无法正常工作。这样做的原因是因为测试正在建立租户连接,但应用程序却没有。我们可以通过实现租户中间件来解决这个问题。

    上述就是关于数据库多租户最终指南的全部内容,想了解更多关于数据库的信息,请继续关注。

    AA分享网一个高级程序员的学习、分享的IT资源分享平台
    AA分享网-企业网站源码-PHP源码-网站模板-视频教程-IT技术教程 » 数据库多租户最终指南
    • 277会员总数(位)
    • 6130资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 787稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情