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