Layers, hexagons, features and components… on Symfony
En Planeta Huerto somos lectores apasionados y siempre tenemos libros circulando entre los miembros del equipo.
Hace tiempo que compramos y devoramos “Clean Architecture” del Tito Bob. En un anexo al final del libro, Simon Brown expone su punto de vista acerca de la semejanza entre la arquitectura hexagonal y la arquitectura por capas “bien estructurada”. Podéis echar un vistazo en este artículo en el que me baso.
Simon nos habla de como generar límites mediante la encapsulación de clases dentro de paquetes (por ejemplo, archivos jar de Java) y los modificadores de acceso que proveen la interfaz pública, vista desde fuera del paquete.
En el libro pone el ejemplo de un desarrollador recién llegado al equipo y que, sin mucho conocimiento, carga en el controlador el repositorio para obtener una entidad, modificarla y volverla a almacenar; saltándose de este modo todo el flujo a través de la capa de aplicación y trabajando directamente sobre el dominio.
Tampoco es descabellado pensar en ciertos “atajos” que podemos cojer cuando el sprint está llegando a su fin y hay que acabar una feature si o si…
Para “protegernos” de estas prácticas, nos gustó la idea de la encapsulación en paquetes y que éste provea la interfaz de las clases internas con el mundo exterior.
Aquí es donde entra Symfony y sus Bundles…
Symfony And Hexagonal Architecture Encapsulation
Para nosotros, cada hexágono con sus tres capas (Aplicación, Dominio e Infraestructura) se encuentra encapsulado dentro de un Bundle. En él se definen los servicios necesarios para la injección de dependencias del contenedor, todos y cada uno de ellos de modo privado… excepto los command/query handlers. Éstos deben ser públicos para que se pueda acceder a ellos a través del command y/o query bus.
De este modo solo hay una forma de comunicarnos con el dominio: a través de los casos de uso definidos como command handlers en la capa de aplicación.
La llamada a estos comandos se realiza desde el aplicativo (UI): los controladores web (relacionados con el framework Symfony), los comandos de consola (también relacionados con el framework Symfony) o las llamadas al api (relacionadas con ApiPlatform + Messenger).
También puede darse el caso de llamadas a través del ACL desde otros hexágonos mediante el uso del bus.
Por tanto, desde Planeta Huerto, apostamos por la arquitectura 4 de la imagen, basada en un empaquetado completo del componente dejando fuera la parte de UI.
¿Y tu, que opción prefieres?