ドメイン駆動設計 (DDD) とコマンド クエリ責任分離 (CQRS) の原則を使用して、コードを可能な限りシンプルに保つ PHP アプリケーションの例。
見て、遊んで、楽しんでください。スターは大歓迎です
デモを見る · バグを報告する · 機能をリクエストする
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
使用して構造化されています。これにより、境界コンテキストの現在の構造が次のようになっていることがわかります。
$ 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
2 つのメソッドのみが含まれています。より多くのフィルターを含むクエリが必要な場合は、 Criteria
パターンとも呼ばれるSpecification
パターンを使用します。そこで、 searchByCriteria
メソッドを追加します。
ここで例とその実装をここで見ることができます。
ここで集計の例を確認できます。すべての集約は AggregateRoot を拡張する必要があります。
コマンドバスの実装は 1 つあります。
クエリ バスは Symfony メッセージ バスを使用します。
イベント バスは Symfony メッセージ バスを使用します。 MySql バスは MySql+Pulling をバスとして使用します。 RabbitMQ バスは RabbitMQ C 拡張機能を使用します。
ドメイン イベントが公開されるたびに、Prometheus にエクスポートされます。ここから Prometheus パネルにアクセスできます。
不足しているものがいくつかあります (Swagger の追加、ドキュメントの改善など)。必要に応じて自由に追加してください。ガイドラインが必要な場合は、お気軽にお問い合わせください:)
このコードは、#DDD トークを介して #microservices に結合されたフレームワークからのコードで示され、DDD y CQRS: Preguntas Frecuentes ビデオで疑問が解決されました。
CodelyTV Pro コースで使用されるもの: