php ddd example
1.0.0
使用域驱动设计 (DDD) 和命令查询职责分离 (CQRS) 原则的 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(大规模开放在线课程)平台。它与任何框架分离,但它有一些 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
我们的存储库尝试尽可能简单,通常仅包含 2 个方法search
和save
。如果我们需要一些带有更多过滤器的查询,我们使用Specification
模式也称为Criteria
模式。所以我们添加一个searchByCriteria
方法。
您可以在此处查看示例及其实现。
您可以在此处查看聚合示例。所有聚合都应扩展 AggregateRoot。
命令总线有 1 种实现。
查询总线使用 Symfony 消息总线。
事件总线使用 Symfony 消息总线。 MySql Bus 使用 MySql+Pulling 作为总线。 RabbitMQ 总线使用 RabbitMQ C 扩展。
每次发布领域事件时,都会将其导出到 Prometheus。您可以在此处访问 Prometheus 面板。
缺少一些东西(添加招摇,改进文档......),如果您愿意,请随意添加!如果您需要一些指南,请随时与我们联系:)
此代码在 From 框架通过 #DDD 谈话将代码耦合到 #microservices 中进行了展示,疑问在 DDD y CQRS:Preguntas Frecuentes 视频中得到了解答。
在 CodelyTV Pro 课程中使用: