¿Qué es la Arquitectura Hexagonal?
La arquitectura hexagonal, también conocida como Ports and Adapters, fue propuesta por Alistair Cockburn como una forma de estructurar aplicaciones para que sean independientes de frameworks, bases de datos, y otros detalles de infraestructura.
El objetivo es claro: aislar el dominio de negocio de los detalles técnicos. Así, tu lógica de negocio no dependerá de Laravel, ni de una base de datos, ni de ninguna herramienta externa.
Esto permite:
- Hacer pruebas más fáciles y rápidas
- Cambiar herramientas (base de datos, framework, servicios externos) sin tocar el núcleo del sistema
- Reutilizar el dominio en diferentes contextos (web, CLI, API, etc.)
¿Cómo se ve esto en Laravel?
Laravel, por defecto, promueve una estructura basada en capas (Controllers, Models, Views, etc.). Pero no nos obliga a una arquitectura en particular.
La arquitectura hexagonal propone dividir el sistema en tres áreas principales:
1. Core (Dominio)
- Entidades
- Reglas de negocio
- Casos de uso
- Interfaces de puertos
2. Puertos (Ports)
- Interfaces para entrada (por ejemplo, controladores)
- Interfaces para salida (por ejemplo, repositorios, servicios externos)
3. Adaptadores (Adapters)
- Implementaciones concretas para interactuar con Laravel, la base de datos, o APIs externas.
Estructura de Carpetas
Aquí un ejemplo realista en Laravel:
src/
├── Domain/
│ ├── User/
│ │ ├── Entities/
│ │ ├── ValueObjects/
│ │ ├── Repositories/
│ │ └── Services/
│
├── Application/
│ ├── User/
│ │ ├── UseCases/
│ │ └── DTOs/
│
├── Infrastructure/
│ ├── Persistence/
│ │ └── Eloquent/
│ ├── Http/
│ │ ├── Controllers/
│ │ └── Requests/
│ └── Providers/
│
└── Support/
Laravel seguiría manejando rutas, providers, y el ciclo de vida HTTP, pero la lógica de negocio está aislada en el Dominio y la Aplicación.
Ejemplo Rápido: Crear un Usuario
Supongamos que quieres crear un usuario. En una arquitectura tradicional de Laravel, harías todo en un Controller o Service. En hexagonal, se ve así:
Dominio