具有独立数据库的Laravel 5多租户应用程序 - 用户可以访问多个安装
在过去的几年里,我开发了一个非常定制的PHP / MySQL应用程序,用于许多客户端。到目前为止,我一直在为每个客户端创建新数据库和新安装。
这里的第一个明显问题是通过任何代码更改使多个安装保持最新状态;第二个问题是每个安装都有大量的用户;对于大多数客户;其中一些用户是相同的 - 他们必须记住许多单独的用户帐户和URL。
我目前正在将应用程序迁移到Laravel 5,并研究多租户的最佳实现;因此,请寻找有关最佳实施的一些建议。我以前使用过Laravel,但绝不是专家。
这就是我在设置方面的想法。
1 个主数据库,用于保存以下各项的表:
- 所有用户帐户信息
- 访问控制表 - 用户可以访问哪些安装;他们在该安装上的用户级别是什么。
- 每个安装的配置表 - 数据库连接信息、基本配置等。
然后为每个安装创建一个单独的数据库,其中包含该安装所需的所有信息,并提交到该安装。
理想的设置是用户可以转到子域,即 installationname.appname.com;使用其主登录详细信息登录并自动转到所需的安装;或者转到 appname.com,登录,然后选择要连接到的安装。
我的问题是:
- 这是实现我所寻找的目标的最佳安排吗?
- 存储用户正在查看的安装的最佳方法是什么(会话变量)
- 我是否可以在 2 个数据库之间定义一个模型 - 也许将一个连接定义为主连接,然后使用 master 数据库中的数据库连接信息动态定义另一个连接以连接到正确的安装。- 系统经常需要检查用户信息的访问级别等。
我相信有很多问题我没有想到;但是,如果有人有任何可能有帮助的链接或指导,那就太好了。第一次问SO的问题,但过去在这里发现了大量的研究帮助,所以感谢社区!
更新 - 所以我认为我现在有办法做到这一点;使用如上所述的单独数据库;设置
protected $connection = 'tenant_connection'
在与租户特定的数据库内容相关的模型中。
然后,在头文件中的某个位置设置所需的tenant_connection,该变量基于已在 login/by 子域上设置的会话变量。
$tenant = Installation::where('installation', '=', $session['installation'])->first();
Config::set('database.connections.tenant_connection', array('driver' => 'mysql', 'host' => $tenant->db_hostname, 'username' => $tenant->db_username)... etc.
假设关系将跨连接工作;我不明白为什么这行不通;只需要找出设置租户连接的最佳位置。