ADR-002: Stack de Backend — Laravel 13 + PHP 8.5
Date: 2026-07-25 Status: Accepted
Corrección
En la primera pasada de este plan, el Product Owner armó un backend en Node.js/Express por default, sin haber confirmado el lenguaje con el cliente. Esto fue un error: el cliente ya tiene un proyecto existente con la API de Soterex implementada en PHP Laravel (que va a compartir más adelante), y ese es el stack que corresponde para mantener consistencia entre proyectos y poder eventualmente reutilizar/integrar código entre ambos.
Decision
Backend en Laravel 13 (última versión estable, marzo 2026) sobre PHP 8.5 (última versión estable de PHP a julio 2026; Laravel 13 solo exige PHP 8.3+ como mínimo, pero se usa la última por pedido explícito del cliente de ir con "todo lo más nuevo").
Piezas del stack:
- Auth:
kreait/laravel-firebasepara validar en el backend el ID token JWT que emite Firebase Auth del lado del frontend (mismo patrón que ya usa el portal de documentación). - Base de datos: PostgreSQL (driver
pgsql) — ver ADR-003 para el detalle de por qué, y por qué Aurora en vez de RDS estándar. - Cache + Colas: Redis. Los jobs (ingesta de SendRequest cada 30 min, notificaciones a Soterex) se encolan en vez de ejecutarse de forma síncrona — mejor performance y reintentos automáticos ante fallas transitorias, en vez de que un timeout de Soterex bloquee un request HTTP o una corrida del scheduler.
- Scheduler:
routes/console.phpconSchedule::job(...)->everyThirtyMinutes()(sintaxis moderna de Laravel 11+, sinApp\Console\Kernel). - ORM: Eloquent, con UUIDs como primary key en todas las tablas (
HasUuids), consistente con el uso de UUID en el resto del sistema (Firebase UIDs, MTCN como string, etc.).
Rationale
- Mantener el mismo lenguaje/framework que el proyecto de Soterex existente reduce fricción para reutilizar lógica de integración (el
SoterexClientde este proyecto está escrito para que sea fácil de alinear o reemplazar cuando se comparta ese código). - Laravel trae de fábrica lo que este proyecto necesita sin ensamblar librerías sueltas: scheduler, colas, migraciones, Eloquent, validación, políticas de autorización — encaja bien con la necesidad de una matriz de permisos (L/E/B) y ABMs (Países, Estaciones, Usuarios, Roles).
Alternatives Considered
- Node.js/Express (descartado — decisión inicial incorrecta, revertida en esta ADR).
Consequences
- Positivo: consistencia con el ecosistema existente del cliente; Laravel Policies son un buen fit natural para la matriz de permisos configurable (sección 2 del Análisis Funcional).
- Negativo: ninguno relevante — es la opción correcta para este cliente.
- Nota técnica: el
composer.json/estructura de este repo se escribieron a mano en el entorno de generación de este plan porque no había acceso de red a Packagist para corrercomposer create-project— corrercomposer installen un entorno con internet normal (Docker build, CI) resuelve esto sin cambios de código.
Next Steps
- Cuando el cliente comparta el proyecto Laravel existente de Soterex, revisar si conviene reusar su
SoterexClient/paquete de integración en vez del que se armó acá desde cero. backend-devcompleta los endpoints reales (hoy son placeholders) según el PRD de cada módulo.

