wronx / multitenancy-bundle
Symfony的穷人式多租户
Requires
- doctrine/dbal: ~2.3
- symfony/symfony: ~2.8|~3.0
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了...