Layers, hexagons, features and components… on Symfony

David Moya de la Ossa
planetahuerto
Published in
2 min readFeb 11, 2020

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.

1 Layers, 2 Hexágonal, 3 Feature packages, 4 Components

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?

--

--