코드를 최대한 단순하게 유지하는 DDD(Domain-Driven Design) 및 CQRS(Command Query Responsibility Segregation) 원칙을 사용하는 PHP 애플리케이션 의 예입니다.
이것저것 구경하고, 놀고, 즐겨보세요. 별은 환영합니다
데모 보기 · 버그 신고 · 기능 요청
git clone https://github.com/CodelyTV/php-ddd-example php-ddd-example
cd php-ddd-example
cp .env .env.local
)을 생성하세요.make build
make deps
make test
본 프로젝트는 MOOC(Massive Open Online Course) 플랫폼을 지향합니다. 모든 프레임워크에서 분리되어 있지만 일부 Symfony 및 Laravel 구현이 있습니다.
이 저장소는 육각형 아키텍처 패턴을 따릅니다. 또한 modules
사용하여 구성됩니다. 이를 통해 바인딩된 컨텍스트의 현재 구조는 다음과 같습니다.
$ 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
우리 저장소는 가능한 한 단순하게 만들려고 노력하며 일반적으로 search
및 save
2가지 방법만 포함합니다. 더 많은 필터가 포함된 쿼리가 필요한 경우 Criteria
패턴이라고도 알려진 Specification
패턴을 사용합니다. 그래서 searchByCriteria
메소드를 추가합니다.
여기에서 예제를 볼 수 있고 여기에서 그 구현을 볼 수 있습니다.
여기에서 집계의 예를 볼 수 있습니다. 모든 집계는 AggregateRoot를 확장해야 합니다.
명령 버스에는 1개의 구현이 있습니다.
쿼리 버스는 Symfony 메시지 버스를 사용합니다.
이벤트 버스는 Symfony 메시지 버스를 사용합니다. MySql 버스는 MySql+Pulling을 버스로 사용합니다. RabbitMQ 버스는 RabbitMQ C 확장을 사용합니다.
도메인 이벤트가 게시될 때마다 Prometheus로 내보내집니다. 여기에서 Prometheus 패널에 액세스할 수 있습니다.
몇 가지 누락된 사항이 있습니다(스웨거 추가, 문서 개선...). 원하시면 자유롭게 추가하세요! 몇 가지 지침을 원하시면 언제든지 저희에게 연락해주세요 :)
이 코드는 #DDD 대화를 통해 프레임워크에서 #microservices에 결합된 코드에 표시되었으며 DDD y CQRS: Preguntas Frecuentes 비디오에서 답변이 의심됩니다.
CodelyTV Pro 과정에서 사용됩니다: