Aplicación Laravel 5 Multi-Tenancy con bases de datos separadas: los usuarios tienen acceso a múltiples instalaciones
En los últimos años, he desarrollado una aplicación PHP / MySQL muy personalizada que se utiliza para varios clientes. He estado creando una nueva base de datos y una nueva instalación para cada cliente hasta este momento.
El primer problema obvio aquí es mantener varias instalaciones actualizadas con cualquier cambio de código; Un segundo problema es que cada instalación tiene una gran cantidad de usuarios; y para la mayoría de los clientes; algunos de estos usuarios son iguales, y deben tener varias cuentas de usuario separadas y URL para recordar.
Estoy trasladando la aplicación a Laravel 5 en este momento y estoy buscando la mejor implementación para la tenencia múltiple; buscando un pequeño consejo sobre la mejor implementación. He usado Laravel antes, pero de ninguna manera soy un experto.
Esto es lo que estoy pensando en cuanto a configuración.
1 Base de datos maestra que contiene tablas para:
Toda la información de la cuenta de usuarioTabla de control de acceso: a qué instalaciones pueden acceder los usuarios; cuál es su nivel de usuario en esa instalación.Tabla de configuración para cada instalación: información de conexión de la base de datos, configuración básica, etc.Luego, una base de datos separada para cada instalación que contenga toda la información necesaria y enviada a esa instalación.
La configuración ideal es que un usuario puede ir a un subdominio, es decir, installname.appname.com; inicie sesión con sus detalles de inicio de sesión maestro y vaya automáticamente a la instalación requerida; O vaya a appname.com, inicie sesión y luego seleccione a qué instalación conectarse.
Mis preguntas son:
¿Es este el mejor arreglo para lograr lo que estoy buscando?¿Cuál es el mejor método para almacenar qué instalación está mirando el usuario (variable de sesión)¿Puedo definir un modelo entre 2 bases de datos? Tal vez defina una conexión como conexión maestra, luego defina dinámicamente otra conexión utilizando la información de conexión de la base de datos en la base de datos maestra para conectarse a la instalación correcta. - el sistema a menudo necesitará verificar la información del usuario para el nivel de acceso, etc.Estoy seguro de que hay muchos problemas en los que no he pensado; pero si alguien tiene algún enlace u orientación que pueda ayudar, sería genial. Es la primera vez que hago una pregunta sobre SO, pero he encontrado una gran cantidad de ayuda de investigación aquí en el pasado, ¡así que gracias a la comunidad!
ACTUALIZACIÓN - Entonces creo que tengo una manera de hacer que esto funcione ahora; usando bases de datos separadas como arriba; conjunto
protected $connection = 'tenant_connection'
en los modelos relacionados con el contenido de la base de datos específica del arrendatario.
Luego, en algún lugar de un archivo de encabezado, establezca la conexión de inquilino deseada según una variable de sesión que se haya establecido en el inicio de sesión / por subdominio.
$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.
Asumiendo que las relaciones funcionarán a través de conexiones; No veo por qué esto no funcionaría; solo necesita encontrar el mejor lugar para establecer la conexión del inquilino.