Saltar a contenido

Multi-tenant

La plataforma atiende varias marcas o sitios desde el mismo código y, en la mayoría de los casos, la misma base de datos.

Identificación de la plataforma

  1. El front envía el origen del tenant como query param: ?domain=<host>.
  2. El middleware CleanDomain normaliza el valor en clean_domain.
  3. IdentifyPlatform busca platforms.site_domain y llama a PlatformContext::set($id).
  4. PlatformContext queda disponible durante toda la request.
  5. También se fijan el equipo de permisos de Spatie y el locale de gettext.

En entornos locales, de testing y staging, si no llega un dominio válido se usa config('app.url'). En producción, un dominio desconocido devuelve 404.

Reglas de consulta

  • Toda consulta de datos de negocio debe filtrar por platform_id.
  • Las cachés deben incluir la plataforma en la clave y en los tags.
  • Los reportes y exportaciones deben respetar el platform_id.
  • Los permisos se evalúan con el equipo de Spatie correspondiente a la plataforma.
  • No se debe reutilizar una instancia de repositorio entre plataformas durante una request de Octane.

Caché

El prefijo compartido es vortex-play. platform-api, platform-backoffice y platform-bo comparten Redis y prefijo, por lo que un flush por tags afecta a los tres. Las integraciones usan otro namespace.

Convención de claves:

<domain>:<method>:<params>

Siempre incluir todas las dimensiones que afectan el resultado: plataforma, moneda, nivel, mobile, etc.

Convención de tags:

<domain>
<domain>:{platform}
<domain>:{platform}:{mobile}

Riesgos frecuentes

  • Olvidar platform_id en una consulta nueva.
  • Cachear datos sin incluir la plataforma.
  • Usar config() o estado estático que persista entre requests de Octane.
  • Resolver la plataforma una sola vez y reutilizarla en procesos de larga duración.