PHPackages                             alexandrebulete/ddd-foundation - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. alexandrebulete/ddd-foundation

ActiveLibrary[Framework](/categories/framework)

alexandrebulete/ddd-foundation
==============================

Pure PHP DDD Foundation - Domain, Application, and InMemory infrastructure for building DDD projects

1.1.1(3mo ago)34↓33.3%[1 issues](https://github.com/AlexandreBulete/ddd-foundation/issues)3MITPHPPHP ^8.2

Since Dec 23Pushed 3mo agoCompare

[ Source](https://github.com/AlexandreBulete/ddd-foundation)[ Packagist](https://packagist.org/packages/alexandrebulete/ddd-foundation)[ RSS](/packages/alexandrebulete-ddd-foundation/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (2)Versions (4)Used By (3)

DDD Foundation
==============

[](#ddd-foundation)

Pure PHP DDD Foundation for building Domain-Driven Design projects. This package provides the core building blocks: Domain layer (ValueObjects, Repository interfaces, Exceptions), Application layer (Command/Query/Handler), and InMemory infrastructure for testing.

Installation
------------

[](#installation)

```
composer require alexandrebulete/ddd-foundation
```

Structure
---------

[](#structure)

```
src/
├── Domain/
│   ├── Exception/
│   │   └── EntityNotFoundException.php
│   ├── Repository/
│   │   ├── PaginatorInterface.php
│   │   └── RepositoryInterface.php
│   ├── Trait/
│   │   └── AsSelectableEnum.php
│   └── ValueObject/
│       ├── DatetimeVO.php
│       ├── EmailVO.php
│       ├── IdentifierInterface.php
│       ├── IdentifierVO.php
│       └── StringVO.php
├── Application/
│   ├── Command/
│   │   ├── AsCommandHandler.php
│   │   ├── CommandBusInterface.php
│   │   └── CommandInterface.php
│   ├── Criteria/
│   │   ├── CriteriaBuilder.php
│   │   ├── CriteriaBuilderInterface.php
│   │   ├── CriteriaNormalizer.php
│   │   └── CriteriaNormalizerInterface.php
│   ├── Handler/
│   │   ├── QueryCollectionHandler.php
│   │   └── QuerySingleHandler.php
│   └── Query/
│       ├── AsQueryHandler.php
│       ├── QueryBusInterface.php
│       └── QueryInterface.php
└── Infrastructure/
    └── InMemory/
        ├── InMemoryPaginator.php
        └── InMemoryRepository.php

```

Usage
-----

[](#usage)

### Value Objects

[](#value-objects)

```
use AlexandreBulete\DddFoundation\Domain\ValueObject\IdentifierVO;
use AlexandreBulete\DddFoundation\Domain\ValueObject\StringVO;

// Generate a new identifier
$id = IdentifierVO::generate();

// Create from string
$id = IdentifierVO::fromString('01HZXYZ...');

// String value object
$title = StringVO::fromString('My Title');
```

### AsSelectableEnum Trait

[](#asselectableenum-trait)

A trait for PHP enums that provides a `choices()` method, useful for form select fields or grid filters:

```
use AlexandreBulete\DddFoundation\Domain\Trait\AsSelectableEnum;

enum StatusEnum: string
{
    use AsSelectableEnum;

    case DRAFT = 'draft';
    case PUBLISHED = 'published';
    case ARCHIVED = 'archived';
}

// Usage
StatusEnum::choices();
// Returns: ['draft' => 'draft', 'published' => 'published', 'archived' => 'archived']
```

Perfect for Sylius Grid filters or Symfony form choices:

```
// Sylius Grid
->addFilter(SelectFilter::create('status', StatusEnum::choices()))

// Symfony Form
->add('status', ChoiceType::class, [
    'choices' => array_flip(StatusEnum::choices()),
])
```

### Repository Interface

[](#repository-interface)

```
use AlexandreBulete\DddFoundation\Domain\Repository\RepositoryInterface;

class PostRepository implements RepositoryInterface
{
    // Implement the interface methods
}
```

### Command/Query Bus

[](#commandquery-bus)

```
use AlexandreBulete\DddFoundation\Application\Command\CommandInterface;
use AlexandreBulete\DddFoundation\Application\Command\AsCommandHandler;

// Define a command
readonly class CreatePostCommand implements CommandInterface
{
    public function __construct(
        public string $title,
        public string $content,
    ) {}
}

// Define a handler
#[AsCommandHandler]
readonly class CreatePostHandler
{
    public function __invoke(CreatePostCommand $command): void
    {
        // Handle the command
    }
}
```

### Criteria System

[](#criteria-system)

The Criteria system provides a standardized way to build and normalize query criteria for filtering data. It consists of two main components:

#### CriteriaBuilder

[](#criteriabuilder)

Provides fluent methods to build typed criteria arrays:

```
use AlexandreBulete\DddFoundation\Application\Criteria\CriteriaBuilder;

$builder = new CriteriaBuilder();

// Equality
$builder->eq('status', 'published');      // ['status' => ['type' => 'eq', 'value' => 'published']]
$builder->neq('status', 'draft');         // ['status' => ['type' => 'neq', 'value' => 'draft']]

// Comparison
$builder->lt('price', 100);               // ['price' => ['type' => 'lt', 'value' => 100]]
$builder->lte('price', 100);              // ['price' => ['type' => 'lte', 'value' => 100]]
$builder->gt('price', 50);                // ['price' => ['type' => 'gt', 'value' => 50]]
$builder->gte('price', 50);               // ['price' => ['type' => 'gte', 'value' => 50]]

// Collections
$builder->in('category', ['a', 'b']);     // ['category' => ['type' => 'in', 'value' => ['a', 'b']]]
$builder->notIn('category', ['c']);       // ['category' => ['type' => 'notIn', 'value' => ['c']]]

// Pattern matching
$builder->like('title', '%keyword%');     // ['title' => ['type' => 'like', 'value' => '%keyword%']]
$builder->notLike('title', '%spam%');     // ['title' => ['type' => 'notLike', 'value' => '%spam%']]
```

#### CriteriaNormalizer

[](#criterianormalizer)

Abstract class to normalize and transform raw criteria before passing them to repositories. Extend this class to add domain-specific normalization logic:

```
use AlexandreBulete\DddFoundation\Application\Criteria\CriteriaNormalizer;
use AlexandreBulete\DddFoundation\Application\Criteria\CriteriaNormalizerInterface;

final readonly class PostCriteriaNormalizer extends CriteriaNormalizer implements CriteriaNormalizerInterface
{
    public function normalize(array $criteria): array
    {
        // First call parent to drop empty values
        $criteria = parent::normalize($criteria);

        // Then apply domain-specific transformations
        $criteria = $this->normalizeStatusCriteria($criteria);

        return $criteria;
    }

    private function normalizeStatusCriteria(array $criteria): array
    {
        $status = $criteria['status'] ?? null;

        if (!is_string($status)) {
            return $criteria;
        }

        $now = new \DateTimeImmutable();

        return match ($status) {
            'published' => $this->mergeCriteria($criteria, [
                'status' => ['type' => 'eq', 'value' => 'published'],
                'publishedAt' => ['type' => 'lte', 'value' => $now],
            ]),
            'scheduled' => $this->mergeCriteria($criteria, [
                'status' => ['type' => 'eq', 'value' => 'published'],
                'publishedAt' => ['type' => 'gt', 'value' => $now],
            ]),
            default => $criteria,
        };
    }
}
```

The base `CriteriaNormalizer` class provides:

- `normalize(array $criteria): array` - Entry point, drops empty values by default
- `dropEmptyValues(array $criteria): array` - Removes null or empty string values
- `mergeCriteria(array $criteria, array $overrides): array` - Merges override criteria into existing criteria

Related Packages
----------------

[](#related-packages)

### Bridges (pure PHP, no framework dependency)

[](#bridges-pure-php-no-framework-dependency)

- `alexandrebulete/ddd-doctrine-bridge` - Doctrine ORM integration
- `alexandrebulete/ddd-apiplatform-bridge` - API Platform integration

### Bundles (Symfony integration)

[](#bundles-symfony-integration)

- `alexandrebulete/ddd-symfony-bundle` - Symfony Messenger integration
- `alexandrebulete/ddd-doctrine-bundle` - Doctrine bundle for Symfony
- `alexandrebulete/ddd-apiplatform-bundle` - API Platform bundle for Symfony
- `alexandrebulete/ddd-sylius-bundle` - Sylius Stack integration

###  Health Score

38

—

LowBetter than 85% of packages

Maintenance76

Regular maintenance activity

Popularity7

Limited adoption so far

Community13

Small or concentrated contributor base

Maturity49

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 75% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~22 days

Total

3

Last Release

94d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/15733a17c9dd08fc7def3be016f324453d4f0de828438858d13f63e7c3388353?d=identicon)[Alexandre Buleté](/maintainers/Alexandre%20Bulet%C3%A9)

---

Top Contributors

[![AlexandreBulete](https://avatars.githubusercontent.com/u/40428152?v=4)](https://github.com/AlexandreBulete "AlexandreBulete (12 commits)")[![github-actions[bot]](https://avatars.githubusercontent.com/in/15368?v=4)](https://github.com/github-actions[bot] "github-actions[bot] (4 commits)")

### Embed Badge

![Health badge](/badges/alexandrebulete-ddd-foundation/health.svg)

```
[![Health](https://phpackages.com/badges/alexandrebulete-ddd-foundation/health.svg)](https://phpackages.com/packages/alexandrebulete-ddd-foundation)
```

###  Alternatives

[laravel/framework

The Laravel Framework.

34.6k509.9M17.0k](/packages/laravel-framework)[sulu/sulu

Core framework that implements the functionality of the Sulu content management system

1.3k1.3M152](/packages/sulu-sulu)[sylius/sylius

E-Commerce platform for PHP, based on Symfony framework.

8.4k5.6M650](/packages/sylius-sylius)[pimcore/pimcore

Content &amp; Product Management Framework (CMS/PIM/E-Commerce)

3.7k3.7M389](/packages/pimcore-pimcore)[contao/core-bundle

Contao Open Source CMS

1231.6M2.3k](/packages/contao-core-bundle)[flow-php/flow

PHP ETL - Extract Transform Load - Data processing framework

81733.7k](/packages/flow-php-flow)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
