Contoh aplikasi PHP yang menggunakan prinsip Domain-Driven Design (DDD) dan Command Query Responsibility Segregation (CQRS) yang menjaga kode sesederhana mungkin.
Lihatlah, mainkan dan bersenang-senanglah dengan ini. Bintang dipersilakan
Lihat Demo · Laporkan bug · Minta fitur
git clone https://github.com/CodelyTV/php-ddd-example php-ddd-example
cd php-ddd-example
cp .env .env.local
) jika Anda ingin mengubah parameter apa punmake build
make deps
make test
Proyek ini mencoba menjadi platform MOOC (Massive Open Online Course). Ini dipisahkan dari kerangka apa pun, tetapi memiliki beberapa implementasi Symfony dan Laravel.
Repositori ini mengikuti pola Arsitektur Heksagonal. Selain itu, ini disusun menggunakan modules
. Dengan ini, kita dapat melihat bahwa struktur Konteks Terikat saat ini adalah:
$ 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
Repositori kami berusaha sesederhana mungkin biasanya hanya berisi 2 metode search
dan save
. Jika kita memerlukan beberapa kueri dengan lebih banyak filter, kita menggunakan pola Specification
yang juga dikenal sebagai pola Criteria
. Jadi kami menambahkan metode searchByCriteria
.
Anda dapat melihat contohnya di sini dan implementasinya di sini.
Anda dapat melihat contoh agregat di sini. Semua agregat harus memperluas AggregateRoot.
Ada 1 implementasi bus perintah.
Bus Kueri menggunakan Bus Pesan Symfony.
Bus Acara menggunakan Bus Pesan Symfony. Bus MySql menggunakan MySql+Pulling sebagai bus. Bus RabbitMQ menggunakan ekstensi RabbitMQ C.
Setiap kali peristiwa domain dipublikasikan, peristiwa tersebut diekspor ke Prometheus. Anda dapat mengakses panel Prometheus di sini.
Ada beberapa hal yang hilang (tambahkan kesombongan, perbaiki dokumentasi...), silakan tambahkan ini jika Anda mau! Jika Anda ingin beberapa pedoman jangan ragu untuk menghubungi kami :)
Kode ini ditampilkan dalam kode Dari kerangka kerja yang digabungkan ke #layanan mikro melalui pembicaraan #DDD dan keraguan yang dijawab dalam video DDD y CQRS: Preguntas Frecuentes.
Digunakan dalam kursus CodelyTV Pro: