Skip to content
Back to skills

Acc Create Aggregate

ASecurity

Generates DDD Aggregates for PHP 8.5. Creates consistency boundaries with root entity, domain events, and invariant protection. Includes unit tests.

  • 666 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 2, 2026
ai-agentsgophpperformance

Security analysis

A100/100

Scanned September 2, 2026

npx -y skills add majiayu000/claude-skill-registry --skill acc-create-aggregate --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Acc Create Aggregate?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Acc Create Aggregate
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/majiayu000-acc-create-aggregate-claude-skill-registry/badge)](https://www.skillsdirectory.com/skills/majiayu000-acc-create-aggregate-claude-skill-registry)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: acc-create-aggregate
description: Generates DDD Aggregates for PHP 8.5. Creates consistency boundaries with root entity, domain events, and invariant protection. Includes unit tests.
---

# Aggregate Generator

Generate DDD-compliant Aggregates with root, domain events, and tests.

## Aggregate Characteristics

- **Consistency boundary**: All changes atomic
- **Root entity**: Single entry point
- **Transactional consistency**: Invariants always valid
- **Domain events**: Records what happened
- **Encapsulation**: Children accessed through root
- **Identity**: Referenced by root ID

---

## Generation Process

### Step 1: Generate Base AggregateRoot

**Path:** `src/Domain/Shared/Aggregate/`

1. `AggregateRoot.php` — Base class with event recording

### Step 2: Generate Aggregate Root Entity

**Path:** `src/Domain/{BoundedContext}/Entity/`

1. `{Name}.php` — Main aggregate root

### Step 3: Generate Child Entities (if needed)

**Path:** `src/Domain/{BoundedContext}/Entity/`

1. `{ChildName}.php` — Child entity inside aggregate

### Step 4: Generate Domain Events

**Path:** `src/Domain/{BoundedContext}/Event/`

1. `{Name}CreatedEvent.php`
2. `{Name}{Action}Event.php` for each behavior

### Step 5: Generate Tests

**Path:** `tests/Unit/Domain/{BoundedContext}/Entity/`

---

## File Placement

| Component | Path |
|-----------|------|
| Base AggregateRoot | `src/Domain/Shared/Aggregate/` |
| Aggregate Entity | `src/Domain/{BoundedContext}/Entity/` |
| Child Entities | `src/Domain/{BoundedContext}/Entity/` |
| Domain Events | `src/Domain/{BoundedContext}/Event/` |
| Unit Tests | `tests/Unit/Domain/{BoundedContext}/Entity/` |

---

## Naming Conventions

| Component | Pattern | Example |
|-----------|---------|---------|
| Aggregate Root | `{Name}` | `Order` |
| Child Entity | `{Parent}{Name}` | `OrderLine` |
| Created Event | `{Name}CreatedEvent` | `OrderCreatedEvent` |
| State Event | `{Name}{Action}Event` | `OrderConfirmedEvent` |

---

## Quick Template Reference

### Base AggregateRoot

```php
abstract class AggregateRoot
{
    private array $events = [];

    protected function recordEvent(DomainEvent $event): void
    {
        $this->events[] = $event;
    }

    public function releaseEvents(): array
    {
        $events = $this->events;
        $this->events = [];
        return $events;
    }
}
```

### Aggregate Root Entity

```php
final class {Name} extends AggregateRoot
{
    private {Name}Status $status;

    private function __construct(
        private readonly {Name}Id $id,
        {properties}
    ) {
        $this->status = {Name}Status::Draft;
    }

    public static function create({Name}Id $id, {params}): self
    {
        $aggregate = new self($id, {args});

        $aggregate->recordEvent(new {Name}CreatedEvent(...));

        return $aggregate;
    }

    public function {behavior}({params}): void
    {
        $this->ensureValidState();
        // Apply change
        $this->recordEvent(new {Name}{Behavior}Event(...));
    }
}
```

### Child Entity

```php
final readonly class {ChildName}
{
    public function __construct(
        public {PropertyType} $property1,
        public {PropertyType} $property2
    ) {}

    public function total(): Money
    {
        return $this->unitPrice->multiply($this->quantity);
    }
}
```

---

## Design Rules

| Rule | Good | Bad |
|------|------|-----|
| Transaction Boundary | One aggregate per transaction | Multiple aggregates |
| Reference | By ID only | Full entity reference |
| Size | Small, focused | Large with many collections |
| Invariants | Always valid | Can be in invalid state |
| Events | Record all state changes | No event recording |

---

## Anti-patterns to Avoid

| Anti-pattern | Problem | Solution |
|--------------|---------|----------|
| Large Aggregate | Performance issues | Split into smaller aggregates |
| Entity References | Tight coupling | Use IDs only |
| Public Setters | No invariant protection | Use behavior methods |
| Missing Events | Can't track history | Record event for each change |
| No Root | Multiple entry points | Single root entity |

---

## References

For complete PHP templates and examples, see:
- `references/templates.md` — AggregateRoot, Entity, Child Entity, Test templates
- `references/examples.md` — Order aggregate with OrderLine, events, and tests

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.