Ejemplo de una aplicación PHP que utiliza los principios de diseño basado en dominio (DDD) y segregación de responsabilidad de consulta de comandos (CQRS) manteniendo el código lo más simple posible.
Echa un vistazo, juega y diviértete con esto. las estrellas son bienvenidas
Ver demostración · Informar un error · Solicitar una función
git clone https://github.com/CodelyTV/php-ddd-example php-ddd-example
cd php-ddd-example
cp .env .env.local
) si desea modificar algún parámetromake build
make deps
make test
Este proyecto pretende ser una plataforma MOOC (Massive Open Online Course). Está desacoplado de cualquier marco, pero tiene algunas implementaciones de Symfony y Laravel.
Este repositorio sigue el patrón de Arquitectura Hexagonal. Además, está estructurado mediante modules
. Con esto podemos ver que la estructura actual de un Contexto Acotado es:
$ tree - L 4 src
src
|-- Mooc // Company subdomain / Bounded Context: Features related to one of the company business lines / products
| ` -- Videos // Some Module inside the Mooc context
| |-- Application
| | |-- Create // Inside the application layer all is structured by actions
| | | |-- CreateVideoCommand .php
| | | |-- CreateVideoCommandHandler .php
| | | ` -- VideoCreator .php
| | |-- Find
| | |-- Trim
| | ` -- Update
| |-- Domain
| | |-- Video .php // The Aggregate of the Module
| | |-- VideoCreatedDomainEvent .php // A Domain Event
| | |-- VideoFinder .php
| | |-- VideoId .php
| | |-- VideoNotFound .php
| | |-- VideoRepository .php // The `Interface` of the repository is inside Domain
| | |-- VideoTitle .php
| | |-- VideoType .php
| | |-- VideoUrl .php
| | ` -- Videos .php // A collection of our Aggregate
| ` -- Infrastructure // The infrastructure of our module
| |-- DependencyInjection
| ` -- Persistence
| ` -- MySqlVideoRepository .php // An implementation of the repository
` -- Shared // Shared Kernel: Common infrastructure and domain shared between the different Bounded Contexts
|-- Domain
` -- Infrastructure
Nuestros repositorios intentan ser lo más simples posible y generalmente solo contienen 2 métodos: search
y save
. Si necesitamos alguna consulta con más filtros utilizamos el patrón Specification
también conocido como patrón Criteria
. Entonces agregamos un método searchByCriteria
.
Puedes ver un ejemplo aquí y su implementación aquí.
Puedes ver un ejemplo de un agregado aquí. Todos los agregados deben extender AggregateRoot.
Hay 1 implementaciones del bus de comando.
El bus de consultas utiliza el bus de mensajes de Symfony.
El bus de eventos utiliza el bus de mensajes de Symfony. El bus MySql utiliza MySql+Pulling como bus. El bus RabbitMQ utiliza la extensión RabbitMQ C.
Cada vez que se publica un evento de dominio, se exporta a Prometheus. Puedes acceder al panel de Prometheus aquí.
Faltan algunas cosas (añadir arrogancia, mejorar la documentación...), ¡siéntete libre de añadir esto si quieres! Si quieres algunas pautas no dudes en contactarnos :)
Este código se mostró en la charla Del código acoplado del framework a #microservicios a través de #DDD y las dudas fueron respondidas en el video DDD y CQRS: Preguntas Frecuentes.
Utilizado en los cursos de CodelyTV Pro: