使用Symfony2和Doctrine2开发多租户应用程序的最佳实践

Jer*_*emy 19 php saas multi-tenant symfony doctrine-orm

我正在开发一个需要支持多租户模型的应用程序.我正在使用symfony2 php框架和doctrine2.

我不确定构建此要求的最佳方法.Symfony的ACL功能是否提供了解决方案的一部分?

您可以提供哪些建议或想法?是否有任何已实施此策略的示例symfony2应用程序或开源应用程序?

我的第一个想法是在所有表中使用tenant_id列,并将其与应用程序中的帐户对象相关联.我不确定ACL是否应该照顾我想要做的事情,或者你是否还要对所有针对你的对象的查询负责,这样他们就不会返回未经授权的数据.

如果我没有使用Doctrine,可能很容易说只是附加Where tenant_id = @accountid到每个查询,但我不确定这是正确的方法.

谢谢

Gek*_*kie 5

我们已经这样做了一段时间了(尽管没有symfony和doctrine,但问题仍然存在) - 我们从一个庞大的数据库开始,并在每个表中的每行实现一个"环境标识符".这种模式迁移很简单:所有代码都是统一的,因此模式更改只是对代码和模式的单一更改.

然而,这会导致速度问题(大型表格),敏捷性(移动/备份等大型数据集比很多小型数据集更加密集),当然更容易破碎的环境,因为单个故障会拉低系统中的每个数据集. ..

然后我们切换到多个数据库; 每个环境都有自己的架构.通过利用Doctrine提供的迁移(在我们的例子中为1),我们能够快速更新整个应用程序或仅单个环境.此外,在帐篷之间移动特定变化的能力允许更快的速度和优化精度.

我的建议是:创建一个扩展到不同租户的单个核心,并保持每个帐户的本地自定义数据库配置.(在类似app.ini的结构中)

/
    apps/
        tentant1/
            models/ <--- specific to the tenant
            libraries/ <--- specific to the tenant
            config/
                app.ini <--- specific configuration
        tentant2/
        /**/ etc
    core/
        models/ <--- system wide models
        libraries/ <--- system wide libraries (i.e. doctrine)
        core.ini <--- system wide configuration
Run Code Online (Sandbox Code Playgroud)

这可以保持一切井然有序.我们甚至可以为每个帐篷提供核心的结构.因此能够覆盖特定于租户的"核心"的每个方面.


Tar*_*req 1

BEST在不同的头脑中建立不同的通知。请更具体地提出问题。开发多租户系统的方法之一是在所有表中放置一个公共主键来建立关系。主键的类型和性质是可靠的项目。