Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jorge07/ddd-playground
Domain-Driven Design in a PHP project using Symfony
https://github.com/jorge07/ddd-playground
ddd docker learning-ddd php php-ddd rest-api symfony
Last synced: 1 day ago
JSON representation
Domain-Driven Design in a PHP project using Symfony
- Host: GitHub
- URL: https://github.com/jorge07/ddd-playground
- Owner: jorge07
- Created: 2016-08-08T17:37:46.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2022-02-28T09:57:57.000Z (over 2 years ago)
- Last Synced: 2024-07-23T15:32:46.687Z (4 months ago)
- Topics: ddd, docker, learning-ddd, php, php-ddd, rest-api, symfony
- Language: PHP
- Homepage:
- Size: 688 KB
- Stars: 592
- Watchers: 53
- Forks: 84
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
DDD Playground
==============> For a more acurated DDD, CQRS and Event Sourcing implementation [see here](https://github.com/jorge07/symfony-4-es-cqrs-boilerplate)
**Wallet API** in Symfony following DDD (Domain Driver Design).
### Examples in the repo
- [x] **User authentication** based in JWT
- [x] **UUID as binary** to improve the performance and create a nightmare for the dba.
- [x] Automated tasks with ant.
- [x] **Dev and CI environments in Docker**. Boosting build speed with docker **cache layers** in pipeline. Orchestrating with **Docker Compose**.
- [x] An example of **table inheritance and discriminator strategy**
- [x] How to deal with **EAV** (Entity-Attribute-Value) with **Json data type**.
- [x] Code structured in layers as appears in DDD in php book.
- [x] Test for api in **behat** accessing via web server (*Acceptance tests*).
- [x] Integration test with **Lakion api test case** and **Alice** for fixtures and how to integrate it with **behat**.
- [x] **Command Bus** implementation
- [x] DomainEvents
- [x] Events to RabbitMQ
- [x] Events stored in ElasticSearch and Kibana for reading in `:5601`
### The folder structure
src
\
|\ Application `Contains the Use Cases of the domain system and the Data Transfer Objects`
|
|\ Domain `The system business logic layer`
|
|\ Infrastructure `Its the implementation of the system outside the model. I.E: Persistence, serialization, etc`
|
\ UI `User Interface. This use to be inside the Infrastructure layer, but I don't like it.`### The tests
The tests follow the same structure and the *phpunit* tests are tagged with group tags: *unit* or *functional*.
The *aceptation tests* are inside the test `UI` layer and attack the application from outside using Guzzle.
### The Environment setup
The environment is in PHP7.1 and the development containers are on `etc/infrastructure/dev/docker-compose.yml`
Up environment with: `docker-compose -f etc/infrastructure/dev/docker-compose.yml up -d`
Install dependencies: `docker-compose -f etc/infrastructure/dev/docker-compose.yml exec fpm sh -lc 'composer install'`
Setup database, etc with : `docker-compose -f etc/infrastructure/dev/docker-compose.yml exec fpm sh -lc 'ant build'`
Start **async** listeners: `docker-compose -f etc/infrastructure/dev/docker-compose.yml exec fpm sh -lc 'bin/console rabbitmq:multiple-consumer events'`
- Rabbit Management: `:15672`
![Rabbit](https://i.imgur.com/Wx881tI.png)- Kibana: `:5601`
![Kibana](https://i.imgur.com/AKsVA0t.png)### CI/CD
Follow the `Jenkinsfile` or the `gitlab-ci.yml` file, it's clear enough and contains a simply workflow to:
- build the isolated environment
- `docker-compose -p` to avoid parallel jobs conflicts
- provision the environment
- run the test
- extract reports
- Build and store the artifacts (Docker images)
- Clean the environment