jorge07/symfony-6-es-cqrs-boilerplate

Arquitectura del proyecto

Closed this issue · 5 comments

Hola, esta plantilla ¿Qué arquitectura sigue? Hexagonal? No me queda muy claro o no estoy seguro si estoy identificando correctamente.

Gracias.

Hey @bareser

Esto es algo que no está en la doc y que podría ser interesante.

La arquitectura del repo es hexagonal siguiendo Domain Driven Design.
Basada en capas, esta arquitectura tiene el foco en el Business de la aplicación y dejando las implementaciones para luego.

La estrucura de carpetas es la siguiente:

src/
     Application/
            {BoundedContext} <- Use cases
     Domain/
            {BoundedContext} <- Domain Logic
     Infrastructure/
            {BoundedContext} <- Implementation
     UI/
        console
        http                             <- User Interface {web,api,cli....}
        ....

Aunque en aplicaciones más complejas y con multiples equipos es recomendable darle la vuelta a esto:

src/
      {BoundedContext}
               Application/      <- Use cases
               Domain/            <- Domain Logic
               Infrastructure/  <- Implementation
     UI/
        console
        http                             <- User Interface {web,api,cli....}
        ....

Pero como siempre, it depends.

Así con esto te quedaría una feature con el siguiente workflow

UI::Controller { 
     Use Application/{BoundedContext}/Command|Query 
     Use Command|Query Bus
     bus->handle|ask(command|query) -> Application/{BoundedContext}/.../*Handler { 
              Process the Command|Query accessing to Domain and/or Infrastructure 
     } -> Domain/{BoundedContext}/XXX { 
              Domain manages the Business logic without enter in the implementation, Example: UserRepository::save(AggregateRoot $user); 
     } -> Infrastructure/{BoundedContext}/YYY { 
              Implementations of our Domain. Example: MysqlUserRepository::save(AggregateRoot $user) implements UserRepository 
     }
}

Si necesitas más detalles feel free de abrir una issue o PR para mejorar la documentacion

Muchas gracias @jorge07 por tu explicación, me viene genial.
¡Qué gran valor aportas!

Aquí tienes la clave

You should maybe alias this interface to one of
these existing services:
"App\Infrastructure\Product\ProductCategory\Query\Mysql\MysqlProductCategoryReadModelRepository",
"App\Infrastructure\Product\ProductCategory\Repository\ProductCategoryStore".*

Tienes dos clases que implementan ProductCategoryRepositoryInterface por lo que symfony no sabe cual ha de inyectar