Php Ddd Example

🐘🎯 Hexagonal Architecture + DDD + CQRS in PHP using Symfony 6
Alternatives To Php Ddd Example
Project NameStarsDownloadsRepos Using ThisPackages Using ThisMost Recent CommitTotal ReleasesLatest ReleaseOpen IssuesLicenseLanguage
Php Ddd Example2,873
5 days ago55PHP
🐘🎯 Hexagonal Architecture + DDD + CQRS in PHP using Symfony 6
Symfony 6 Es Cqrs Boilerplate1,045
3 months ago3mitPHP
Symfony 6 DDD ES CQRS backend boilerplate.
Ecotone467393 days ago510December 02, 2023mitPHP
Ecotone shifts the focus to the business code. In order to make it happen, enables Message-Driven Architecture with DDD, CQRS, Event Sourcing in PHP.
2 years ago1mitPHP
Reusable domain layers. Shipped with industry standard infrastructure.
Kreta176116 years ago27April 28, 201618mitPHP
Modern project management solution
Proophessor Do Symfony156
4 years ago10otherJavaScript
Symfony version of proophessor-do CQRS + Event Sourcing example app
Bicing Api141
5 years ago2PHP
Get statistics and locations of bicycle stations through REST API
User Bundle112214 years ago39March 08, 2020mitPHP
A new Symfony user bundle
Symfony Demo App111
4 years ago21March 08, 202013mitPHP
A Symfony demo application with basic user management
Event Store Symfony Bundle1092162 years ago14February 07, 202210bsd-3-clausePHP
Event Store Symfony Bundle
Alternatives To Php Ddd Example
Select To Compare

Alternative Project Comparisons

Codely logo

Hexagonal Architecture, DDD & CQRS in PHP CodelyTV Courses Symfony 6 Type Coverage CI pipeline status

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

Environment Setup

Needed tools

  1. Install Docker
  2. Clone this project: git clone php-ddd-example
  3. Move to the project folder: cd php-ddd-example

Environment configuration

  1. Create a local environment file (cp .env .env.local) if you want to modify any parameter

Application execution

  1. Install all the dependencies and bring up the project with Docker executing: make build
  2. Then you'll have 3 apps available (2 APIs and 1 Frontend):
    1. Mooc Backend: http://localhost:8030/health-check
    2. Backoffice Backend: http://localhost:8040/health-check
    3. Backoffice Frontend: http://localhost:8041/health-check

Tests execution

  1. Install the dependencies if you haven't done it previously: make deps
  2. Execute PHPUnit and Behat tests: make test

Project explanation

This project tries to be a MOOC (Massive Open Online Course) platform. It's decoupled from any framework, but it has some Symfony and Laravel implementations.

Bounded Contexts

  • Mooc: Place to look in if you wanna see some code . Massive Open Online Courses public platform with users, videos, notifications, and so on.
  • Backoffice: Here you'll find the use cases needed by the Customer Support department in order to manage users, courses, videos, and so on.

Hexagonal Architecture

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

|-- 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

Repository pattern

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 a searchByCriteria method.

You can see an example here and its implementation here.


You can see an example of an aggregate here. All aggregates should extend the AggregateRoot.

Command Bus

There is 1 implementations of the command bus.

  1. Sync using the Symfony Message Bus.

Query Bus

The Query Bus uses the Symfony Message Bus.

Event 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 want some 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.

Used in the CodelyTV Pro courses:

remember to visit our courses

Popular Symfony Projects
Popular Cqrs Projects
Popular Frameworks Categories
Related Searches

Get A Weekly Email With Trending Projects For These Categories
No Spam. Unsubscribe easily at any time.
Domain Driven Design
Doctrine Orm
Message Bus