wronx/multitenancy-bundle

Symfony的穷人式多租户

安装: 18

依赖者: 0

建议者: 0

安全: 0

星标: 2

关注者: 3

分支: 0

开放问题: 0

类型:symfony-bundle

v0.9-RC1 2017-07-19 16:33 UTC

This package is auto-updated.

Last update: 2024-09-15 22:08:14 UTC


README

穷人式的Symfony多租户Bundle

这段糟糕的代码可能有助于你在Symfony中创建多租户应用程序。或者可能不会。我不知道,我是一个水管工,不是一个占卜师。

许可协议

版权 © 2017 github.com/WRonX 此作品是免费的。你可以在Sam Hocevar发布的“Do What The Fuck You Want To Public License”版本2的条款下重新分发或修改它。有关更多详细信息,请参阅http://www.wtfpl.net/

特性

只有一个:你可以在应用程序中启用多租户架构。

工作原理

我想不出更好的解决方案,所以每个租户都有一个名称和主机,通过这些来识别。名称用于在Symfony控制台中识别租户,主机用于其他所有操作。一般来说,ConnectionWrapper根据当前使用的宿主名更改Connection数据库。

注意:在性能方面,这可能不是大型应用程序的最佳选择,并且你可能需要以某种方式缓存Connection以防止它在每次创建时都执行租户识别SQL请求。但我知道什么。

安装和配置

1. 安装bundle

首先,使用composer安装bundle

composer require wronx/multitenancy-bundle

然后将bundle添加到AppKernel

// app/AppKernel.php

$bundles = array( /* ... */
            new WRonX\MultiTenancyBundle\WRonXMultiTenancyBundle(),

并在config.yml中添加以下内容

# app/config/config.yml

wronx_multitenancy:
    enabled: true

如果你跳过最后一步,默认情况下将禁用多租户。

注意:禁用多租户时,应用程序将正常使用主数据库(在parameters.yml中描述)。

以下步骤假设已启用多租户。

2. 准备租户管理数据库

首先,创建一个数据库,它将作为租户管理器。这意味着连接详细信息将存储在那里。密码将以纯文本形式存储,就像parameters.yml中的DB密码一样。应将parameters.yml中的连接详细信息指向租户管理器数据库。现在,租户管理器数据库应该包含具有每个租户连接详细信息的tenants表。

mysql> SHOW COLUMNS FROM tenants;
+--------+--------------+------+-----+---------+----------------+
| Field  | Type         | Null | Key | Default | Extra          |
+--------+--------------+------+-----+---------+----------------+
| id     | int(11)      | NO   | PRI | NULL    | auto_increment |
| name   | varchar(255) | YES  |     | NULL    |                |
| host   | varchar(255) | YES  |     | NULL    |                |
| dbName | varchar(255) | YES  |     | NULL    |                |
| dbPass | varchar(255) | YES  |     | NULL    |                |
| dbUser | varchar(255) | YES  |     | NULL    |                |
| dbHost | varchar(255) | YES  |     | NULL    |                |
| active | tinyint(1)   | YES  |     | NULL    |                |
+--------+--------------+------+-----+---------+----------------+

由于ConnectionWrapper使用REGEXP主机字段可以看起来像以下内容

  • .*
  • ^(.*\.)*client01\.yourapplicationdomain\.com$
  • ^((.*\.)*client02\.yourapplicationdomain\.com)|(clientsowndomain\.com)$

从该示例中可以看出,你可以处理多个客户端域名,并且可以忽略子域名。此外,SELECT查询是按主机字段长度的降序排序的,因此每个对不存在的主机(租户)的请求都将由具有.*主机的记录中定义的连接数据处理,这对于创建演示环境可能很有用。感谢swiniak提出REGEXP想法。

2. 使用包含的代码和配置

这应该很直观。

4. 使用Symfony控制台

请记住为每个命令添加租户名称,使用--tenant=TENANTNAME(这是tenants表中的名称字段)。

4. 新的控制台命令

添加了两个新的控制台命令

  • tenants:list仅显示可用的租户名称(以及一些其他数据)
  • tenants:execute "command to execute"在所有租户上执行给定的(引用!)命令。例如:php app/console tenants:execute "doctrine:schema:update --dump-sql"

即将推出

  • 添加控制台命令以自动创建租户表和管理租户
  • 将忽略命令列表更改为命令白名单

摘要

哦,看在上帝的份上,我已经花了很多时间写readme了...