Beispiel einer PHP-Anwendung, die die Prinzipien Domain-Driven Design (DDD) und Command Query Responsibility Segregation (CQRS) verwendet, um den Code so einfach wie möglich zu halten.
Schauen Sie es sich an, spielen Sie und haben Sie Spaß damit. Sterne sind willkommen
Demo ansehen · Einen Fehler melden · Eine Funktion anfordern
git clone https://github.com/CodelyTV/php-ddd-example php-ddd-example
cd php-ddd-example
cp .env .env.local
), wenn Sie einen Parameter ändern möchtenmake build
make deps
make test
Dieses Projekt versucht, eine MOOC-Plattform (Massive Open Online Course) zu sein. Es ist von jedem Framework entkoppelt, verfügt jedoch über einige Symfony- und Laravel-Implementierungen.
Dieses Repository folgt dem Muster der hexagonalen Architektur. Außerdem ist es mithilfe von modules
strukturiert. Daraus können wir erkennen, dass die aktuelle Struktur eines begrenzten Kontexts wie folgt aussieht:
$ 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
Unsere Repositories versuchen so einfach wie möglich zu sein und enthalten normalerweise nur zwei search
und save
. Wenn wir eine Abfrage mit mehr Filtern benötigen, verwenden wir das Specification
, auch bekannt als Criteria
. Deshalb fügen wir eine searchByCriteria
-Methode hinzu.
Ein Beispiel können Sie hier und dessen Umsetzung hier sehen.
Ein Beispiel für ein Aggregat können Sie hier sehen. Alle Aggregate sollten die AggregateRoot erweitern.
Es gibt 1 Implementierungen des Befehlsbusses.
Der Query Bus nutzt den Symfony Message Bus.
Der Event Bus nutzt den Symfony Message Bus. Der MySql-Bus verwendet ein MySql+Pulling als Bus. Der RabbitMQ-Bus verwendet die RabbitMQ-C-Erweiterung.
Jedes Mal, wenn ein Domänenereignis veröffentlicht wird, wird es nach Prometheus exportiert. Hier können Sie auf das Prometheus-Panel zugreifen.
Es fehlen einige Dinge (Swagger hinzufügen, Dokumentation verbessern ...), Sie können dies gerne hinzufügen, wenn Sie möchten! Wenn Sie einige Richtlinien wünschen, können Sie uns gerne kontaktieren :)
Dieser Code wurde im „Vom Framework gekoppelten Code an #Microservices durch #DDD-Vortrag“ gezeigt und Zweifel wurden im Video „DDD y CQRS: Preguntas Frecuentes“ beantwortet.
Wird in den CodelyTV Pro-Kursen verwendet: