Example of a PHP application using Domain-Driven Design (DDD) and Command Query Responsibility Segregation (CQRS) principles keeping the code as simple as possible.
Take a look, play and have fun with this. Stars are welcome
View Demo · Report a bug · Request a feature
git clone https://github.com/CodelyTV/php-ddd-example php-ddd-example
cd php-ddd-example
cp .env .env.local
) if you want to modify any parametermake build
make deps
make test
This project tries to be a MOOC (Massive Open Online Course) platform. It's decoupled from any framework, but it hassome Symfony and Laravel implementations.
This repository follows the Hexagonal Architecture pattern. Also, it's structured using modules
.With this, we can see that the current structure of a Bounded Context is:
$ 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
Our repositories try to be as simple as possible usually only containing 2 methods search
and save
.If we need some query with more filters we use the Specification
pattern also known as Criteria
pattern. So we add asearchByCriteria
method.
You can see an example hereand its implementation here.
You can see an example of an aggregate here. All aggregates shouldextend the AggregateRoot.
There is 1 implementations of the command bus.
The Query Bus uses the Symfony Message Bus.
The Event Bus uses the Symfony Message Bus.The MySql Bus uses a MySql+Pulling as a bus.The RabbitMQ Bus uses RabbitMQ C extension.
Every time a domain event is published it's exported to Prometheus. You can access to the Prometheus panel here.
There are some things missing (add swagger, improve documentation...), feel free to add this if you want! If you wantsome guidelines feel free to contact us :)
This code was shown in the From framework coupled code to #microservices through #DDD talk and doubts where answered in the DDD y CQRS: Preguntas Frecuentes video.
我正在通过a 在某种程度上,我希望一个单元格有一个灰色背景,以PHP计算的百分比为基础。 例如:50%表示单元格背景的一半为灰色,其余为空白33,33%=背景的1/3等。 我遇到的问题是,中的文本被任何其他的DIV所覆盖,如果我将颜色应用于中,我稍后还会覆盖文本等。 代码如下:$percent = 1/3; // For example $percent_friendly = number_for
Despite PHP's amazing assortment of array functions and juggling maneuvers, I found myself needing a way to get the FULL array key mapping to a specific value. This function does that, and returns an
应用服务 应用层是将领域模型与查询或更改其状态的客户端分离的层。应用服务是此层的构建块。正如 Vaughn Vernon 所说:“应用服务是领域模型的直接客户端。” 你可以考虑把应用服务当作外部世界(HTML 表单,API 客户端,命令行,框架,UI 等等)与领域模型自身之间的连接点。考虑向外部展示系统的顶级用例,也许会有帮助。例如:“作为来宾,我想注册”,“作为以登录用户,我要购买产品”,等等。
<?php /** * Title: 批量修改CloudFlare上的所有域名的DNS * Author: Rudon <285744011@qq.com> * Date: 2019-03-08 * * https://dash.cloudflare.com/ * https://api.cloudflare.com
php命令行用法简介,php命令行用法 Php是一个非常流行的web服务端脚本语言。其实,php不仅仅可以在web服务器中充当重要角色。在命令行一样可以执行。 本文中,笔者为各位介绍下php在命令行中的使用方法。 1、 查看php的版本、配置 在命令行中输入php –v 即可查看当前php的版本。 Java代码 PHP 5.2.17(cli) (built: Feb 2 2011 11:19:21
GNU DDD (Data Display Debuger) 是一个图形化的调试工具,通过对调试命令例如 GDB、DBX、WDB、JDB、XDB 等等命令行工具的封装,提供一个非常友好的调试界面。
所以我将通过使用一个例子来解释这个问题,因为它使一切更加具体,希望能减少歧义。 架构非常简单 1微服务 每个微服务都将使用CQRS/ES设计模式,这意味着 每个微服务都有自己的Aggregate映射现实世界问题的域 聚合的状态将从事件存储重建 每个事件都将表示聚合中的状态更改,并将通过消息代理传输到对更改感兴趣的任何服务 每个微服务都将在其自己的域内进行事务处理 每个微服务最终都会与其他域保持一致
Wild Workouts Wild Workouts is an example Go DDD project that we created to show how to build Go applications that are easy to develop, maintain, and fun to work with, especially in the long term! The
假设我有一个对象,该对象应包含(政府 ID)对象。我正在从乘客获取。创建对服务器的请求并获取数据(json),而不是解析接收的数据并存储在存储库中。 我很困惑,因为我想将< code>Passport存储为实体,并将其放入< code>PassportRepository中,但所有关于密码的信息都包含在json中,而不是我在上面收到的信息。 我想我应该使用作为 VO 并将其放入(聚合)对象中。或者
主要内容:前言,贫血模型,应用层(即Service层),领域层(或者叫模型层),优点,缺点,充血模型前言 要想深入掌握和了解 DDD 领域驱动设计的核心,那无论如何也绕不开两大较为抽象的概念——“贫血模型”、“充血模型”: 贫血模型即事务脚本模式。 充血模型即领域模型模式。 贫血模型 贫血模型最早广泛应用源于EJB2,最强盛时期则是由Spring创造,将: “行为”(逻辑、过程); “状态”(数据,对应到语言就是对象成员变量)。 分离到不同的对象中: 只有状态的对象就是所谓的“贫血对象”(常称为
主要内容:1.DDD到MVC,2.DDD的基本概念,3.DDD的战术设计,4.DDD的战略设计,5.DDD的不足1.DDD到MVC 代码角度: 瘦实体模型:只起到数据类的作用,业务逻辑散落到 service,可维护性越来越差 面向数据库表编程,而非模型编程 实体类之间的关系是复杂的网状结构,成为大泥球,牵一发而动全身,导致不敢轻易改代码 service 类承接的所有的业务逻辑,越来越臃肿,很容易出现几千行的 service 类 对外接口直接暴露实体模型,导致不必要开放内部逻辑对外暴露,就算有 D