ตัวอย่าง แอปพลิเคชัน PHP ที่ใช้หลักการ Domain-Driven Design (DDD) และ Command Query Responsibility Segregation (CQRS) ที่ทำให้โค้ดเรียบง่ายที่สุด
ลองดูเล่นและสนุกกับสิ่งนี้ ยินดีต้อนรับดาว
ดูการสาธิต · รายงานจุดบกพร่อง · ขอคุณสมบัติ
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 (Massive Open Online Course) แยกออกจากเฟรมเวิร์กใดๆ แต่มีการใช้งาน Symfony และ Laravel บางอย่าง
พื้นที่เก็บข้อมูลนี้เป็นไปตามรูปแบบสถาปัตยกรรมหกเหลี่ยม นอกจากนี้ยังมีโครงสร้างโดยใช้ modules
ด้วยเหตุนี้ เราจะเห็นว่าโครงสร้างปัจจุบันของ Bounded Context คือ:
$ 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 ครั้ง
Query Bus ใช้ Symfony Message Bus
Event Bus ใช้ Symfony Message Bus MySql Bus ใช้ MySql+Pulling เป็นบัส RabbitMQ Bus ใช้ส่วนขยาย RabbitMQ C
ทุกครั้งที่เผยแพร่กิจกรรมโดเมน กิจกรรมดังกล่าวจะถูกส่งออกไปยัง Prometheus คุณสามารถเข้าถึงแผง Prometheus ได้ที่นี่
มีบางสิ่งที่ขาดหายไป (เพิ่มผยอง ปรับปรุงเอกสาร...) คุณสามารถเพิ่มสิ่งนี้ได้ตามต้องการ! หากคุณต้องการแนวทางปฏิบัติโปรดติดต่อเรา :)
รหัสนี้แสดงในโค้ดจากเฟรมเวิร์กควบคู่กับ #microservices ผ่านการพูดคุย #DDD และข้อสงสัยที่ได้รับคำตอบในวิดีโอ DDD y CQRS: Preguntas Frecuentes
ใช้ในหลักสูตร CodelyTV Pro: