承接 dclouds/ddd 相关项目开发

从需求分析到上线部署,全程专人跟进,保证项目质量与交付效率

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

dclouds/ddd

最新稳定版本:v1.0.1

Composer 安装命令:

composer require dclouds/ddd

包简介

Набор базовых объектов в рамках DDD

README 文档

README

PHP Version License

Набор базовых объектов для реализации Domain-Driven Design (DDD) паттернов в PHP приложениях. Библиотека предоставляет готовые реализации агрегатов, сущностей, объектов-значений и других строительных блоков для создания качественной доменной модели.

Установка через Composer

composer require dclouds/ddd

Основные компоненты

Агрегаты

Агрегаты представляют основные бизнес-объекты в системе и управляют потоком событий предметной области.

Ключевые особенности:

  • Event Sourcing: Фиксация и применение событий для изменения состояния
  • Domain Events: События предметной области для внутренней логики
  • Integration Events: События для интеграции с внешними системами
  • Версионность: Контроль версий агрегатов для консистентности

Создание агрегата:

<?php

use Dclouds\Ddd\Aggregate\AbstractAggregateRoot;
use Dclouds\Ddd\ValueObjects\Uuid\Uuid;

class UserAggregate extends AbstractAggregateRoot
{
    public function __construct(
        protected(set) Uuid $id,
        protected(set) Text $name,
        protected(set) Email $email,
    ) {
        //
    }

    protected function validate(): void
    {
        // Проверка бизнес-правил агрегата
    }
}

Объекты-значения (Value Objects)

Immutable объекты, представляющие концепции предметной области.

Доступные Value Objects:

  1. UUID - Уникальные идентификаторы с поддержкой временного упорядочивания
  2. Email - Email адреса с валидацией
  3. Amount - Денежные суммы с арифметическими операциями
  4. Text - Текстовые значения с ограничениями по длине
  5. Integer - Целые числа с диапазонами
  6. Double - Числа с плавающей точкой

Пример использования UUID:

<?php

use Dclouds\Ddd\ValueObjects\Uuid\Uuid;

class UserId extends Uuid
{
    protected string $typeName = 'Идентификатор пользователя';
}

class UserEmail extends Email
{
    protected string $typeName = 'E-mail пользователя';
}

class ProductPrice extends Amount
{
    protected string $typeName = 'Сумма товара';

    protected ?int $min = 100;
}

class ProductName extends Text
{
    protected string $typeName = 'Название товара';

    protected ?int $min = 5;

    protected ?int $max = 255;
}

Сущности

Базовый класс для бизнес-сущностей, которые могут изменяться в рамках агрегата.

<?php

use Dclouds\Ddd\Entity\AbstractEntity;

class OrderItem extends AbstractEntity
{
    protected string $aggregateClass = OrderAggregate::class;

    public function __construct(
        protected(set) Uuid $productId,
        protected(set) Integer $quantity,
        protected(set) Amount $price,
    ) {
        //
    }

    // Применение событий только в контексте агрегата
    public function applyQuantityChanged(QuantityChangedEvent $event): void
    {
        $this->quantity = $event->newQuantity;
    }
}

Outbox Pattern

Реализация паттерна Outbox для надежной доставки интеграционных событий.

Ключевые особенности:

  • Атомарная запись событий в рамках транзакции
  • Статусы обработки событий
  • Повторные попытки при ошибках
  • Очистка старых успешных событий
<?php

use Dclouds\Ddd\Contracts\Outbox\OutboxServiceInterface;

class EventDispatcher
{
    public function __construct(
        private OutboxServiceInterface $outboxService
    ) {
        //
    }

    public function dispatch(AbstractAggregateRoot $aggregate): void
    {
        // Получение интеграционных событий
        $events = $aggregate->releaseIntegrationEvents();

        // Регистрация в Outbox
        foreach ($events as $event) {
            $this->outboxService->registerEvent($event);
        }
    }
}

Пагинация

Удобные инструменты для работы с пагинацией результатов.

<?php

use Dclouds\Ddd\Paginators\Paginator;
use Dclouds\Ddd\Paginators\PageInfo;

// Создание информации о странице
$pageInfo = new PageInfo(
    page: 2,
    pageSize: 20,
    totalElements: 1000
);

// Создание пагинатора
$paginator = new Paginator($pageInfo);

echo "Текущая страница: " . $paginator->pageInfo->page;
echo "Всего страниц: " . $paginator->pageInfo->totalPages;
echo "Есть следующая страница: " . ($paginator->pageInfo->hasNext ? 'Да' : 'Нет');

Лицензия

Библиотека распространяется под MIT лицензией.

Автор

Эта библиотека создана для упрощения реализации DDD паттернов в PHP приложениях и предоставляет надежную основу для построения качественной доменной модели.

统计信息

  • 总下载量: 2
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 1
  • 点击次数: 0
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 1
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2025-09-14