مثال لتطبيق PHP يستخدم مبادئ التصميم المستند إلى المجال (DDD) وفصل مسؤولية استعلام الأوامر (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 (الدورة التدريبية المفتوحة الضخمة عبر الإنترنت). إنه منفصل عن أي إطار عمل، لكنه يحتوي على بعض تطبيقات Symfony وLaravel.
يتبع هذا المستودع نمط العمارة السداسية. كما أنها منظمة باستخدام modules
. وبهذا يمكننا أن نرى أن الهيكل الحالي للسياق المحدود هو:
$ 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
تحاول مستودعاتنا أن تكون بسيطة قدر الإمكان وعادةً ما تحتوي فقط على طريقتين search
save
. إذا كنا بحاجة إلى بعض الاستعلامات مع المزيد من المرشحات، فإننا نستخدم نمط Specification
المعروف أيضًا باسم نمط Criteria
. لذلك نضيف طريقة searchByCriteria
.
يمكنك رؤية مثال هنا وتنفيذه هنا.
يمكنك رؤية مثال على التجميع هنا. يجب على كافة المجاميع تمديد AggregateRoot.
يوجد تطبيق واحد لحافلة الأوامر.
يستخدم ناقل الاستعلام ناقل رسائل Symfony.
يستخدم ناقل الأحداث ناقل رسائل Symfony. يستخدم MySql Bus MySql+Pulling كحافلة. يستخدم ناقل RabbitMQ امتداد RabbitMQ C.
في كل مرة يتم نشر حدث المجال، يتم تصديره إلى Prometheus. يمكنك الوصول إلى لوحة Prometheus هنا.
هناك بعض الأشياء المفقودة (إضافة التبجح، تحسين التوثيق...)، لا تتردد في إضافة هذا إذا كنت تريد! إذا كنت تريد بعض الإرشادات فلا تتردد في الاتصال بنا :)
تم عرض هذا الرمز في الكود المقترن بإطار العمل إلى #microservices من خلال #DDD talk والشكوك حيث تم الرد عليها في فيديو DDD y CQRS: Preguntas Frecuentes.
المستخدمة في دورات CodelyTV Pro: