Entity Generator
Generate DDD-compliant Entities with identity, behavior, and tests.
Entity Characteristics
- Identity: Has unique identifier (ID)
- Lifecycle: Created, modified, potentially deleted
- Behavior: Contains domain logic (not just data)
- Invariants: Protects business rules
- State transitions: Controlled mutations
- No public setters: State changed via behavior methods
Entity Components
Core Structure
Every Entity consists of:
| Component |
Description |
Identity ({Name}Id) |
Unique identifier, readonly, set at construction |
| Status Enum |
Lifecycle states with transition rules |
| Constructor |
Sets identity, initial status, timestamps, validates invariants |
| Behavior methods |
Domain actions (confirm(), cancel(), addLine()) |
| Query methods |
State checks (isActive(), canBeConfirmed(), isEmpty()) |
touch() helper |
Updates $updatedAt timestamp on mutations |
Supporting Files
| File |
Location |
| Entity |
src/Domain/{BoundedContext}/Entity/{Name}.php |
| Status Enum |
src/Domain/{BoundedContext}/Enum/{Name}Status.php |
| Exceptions |
src/Domain/{BoundedContext}/Exception/{...}Exception.php |
| Unit Test |
tests/Unit/Domain/{BoundedContext}/Entity/{Name}Test.php |
Entity Design Principles
1. Behavior Over Data
Entities must encapsulate domain logic, not just hold data. Use meaningful behavior methods (confirm(), activate()) instead of anemic setters (setStatus()). Each behavior method enforces invariants before mutating state.
2. Invariant Protection
Every mutation method must validate business rules before making changes. Common invariants:
- State guards (e.g., can only modify draft orders)
- Value constraints (e.g., quantity must be positive)
- Relationship constraints (e.g., cannot confirm empty order)
3. State Transitions
Use a Status enum with explicit transition rules. The enum defines canTransitionTo() to enforce valid state machines. Entities delegate transition validation to the enum.
Generation Process
When asked to create an Entity:
- Identify the identity (what makes it unique)
- Define the lifecycle (statuses/states)
- List invariants (business rules to protect)
- Design behavior methods (what it can do)
- Generate tests for behavior and invariants
Naming Conventions
| Concept |
Method Pattern |
Exception |
| State change |
confirm(), activate(), cancel() |
InvalidStateTransitionException |
| Add relation |
addLine(), addItem() |
CannotModifyException |
| Update property |
changeEmail(), updateName() |
InvalidValueException |
| Query state |
isActive(), canBeConfirmed() |
N/A (boolean return) |
Quick Template Reference
Entity skeleton
final class {Name}
{
private {Name}Status $status;
private DateTimeImmutable $createdAt;
private ?DateTimeImmutable $updatedAt = null;
public function __construct(
private readonly {Name}Id $id,
{constructorProperties}
) {
{constructorValidation}
$this->status = {Name}Status::default();
$this->createdAt = new DateTimeImmutable();
}
public function id(): {Name}Id { return $this->id; }
public function status(): {Name}Status { return $this->status; }
{behaviorMethods}
private function touch(): void { $this->updatedAt = new DateTimeImmutable(); }
}
Test skeleton
#[Group('unit')]
#[CoversClass({Name}::class)]
final class {Name}Test extends TestCase
{
public function testCreatesWithValidData(): void
{
$entity = $this->createEntity();
self::assertInstanceOf({Name}Id::class, $entity->id());
self::assertSame({Name}Status::default(), $entity->status());
}
{behaviorTests}
private function createEntity(): {Name}
{
return new {Name}(id: {Name}Id::generate(), {testConstructorArgs});
}
}
Usage
To generate an Entity, provide:
- Name (e.g., "Order", "User")
- Bounded Context (e.g., "Order", "User")
- Identity type (e.g., "OrderId")
- States/Statuses
- Key behaviors needed
- Invariants to protect
References
references/templates.md — full PHP code templates (Entity, Test, State Transition Enum, design principle code samples)
references/examples.md — complete Order Entity and User Entity implementation examples
Converted and distributed by TomeVault — claim your Tome and manage your conversions.
1---2name: create-entity3description: Generates DDD Entities for PHP 8.4. Creates identity-based objects with behavior, state transitions, and invariant protection. Includes unit tests.4---56# Entity Generator78Generate DDD-compliant Entities with identity, behavior, and tests.910## Entity Characteristics1112- **Identity**: Has unique identifier (ID)13- **Lifecycle**: Created, modified, potentially deleted14- **Behavior**: Contains domain logic (not just data)15- **Invariants**: Protects business rules16- **State transitions**: Controlled mutations17- **No public setters**: State changed via behavior methods1819## Entity Components2021### Core Structure2223Every Entity consists of:2425| Component | Description |26|-----------|-------------|27| Identity (`{Name}Id`) | Unique identifier, readonly, set at construction |28| Status Enum | Lifecycle states with transition rules |29| Constructor | Sets identity, initial status, timestamps, validates invariants |30| Behavior methods | Domain actions (`confirm()`, `cancel()`, `addLine()`) |31| Query methods | State checks (`isActive()`, `canBeConfirmed()`, `isEmpty()`) |32| `touch()` helper | Updates `$updatedAt` timestamp on mutations |3334### Supporting Files3536| File | Location |37|------|----------|38| Entity | `src/Domain/{BoundedContext}/Entity/{Name}.php` |39| Status Enum | `src/Domain/{BoundedContext}/Enum/{Name}Status.php` |40| Exceptions | `src/Domain/{BoundedContext}/Exception/{...}Exception.php` |41| Unit Test | `tests/Unit/Domain/{BoundedContext}/Entity/{Name}Test.php` |4243## Entity Design Principles4445### 1. Behavior Over Data4647Entities must encapsulate domain logic, not just hold data. Use meaningful behavior methods (`confirm()`, `activate()`) instead of anemic setters (`setStatus()`). Each behavior method enforces invariants before mutating state.4849### 2. Invariant Protection5051Every mutation method must validate business rules before making changes. Common invariants:52- State guards (e.g., can only modify draft orders)53- Value constraints (e.g., quantity must be positive)54- Relationship constraints (e.g., cannot confirm empty order)5556### 3. State Transitions5758Use a Status enum with explicit transition rules. The enum defines `canTransitionTo()` to enforce valid state machines. Entities delegate transition validation to the enum.5960## Generation Process6162When asked to create an Entity:63641. **Identify the identity** (what makes it unique)652. **Define the lifecycle** (statuses/states)663. **List invariants** (business rules to protect)674. **Design behavior methods** (what it can do)685. **Generate tests** for behavior and invariants6970## Naming Conventions7172| Concept | Method Pattern | Exception |73|---------|----------------|-----------|74| State change | `confirm()`, `activate()`, `cancel()` | `InvalidStateTransitionException` |75| Add relation | `addLine()`, `addItem()` | `CannotModifyException` |76| Update property | `changeEmail()`, `updateName()` | `InvalidValueException` |77| Query state | `isActive()`, `canBeConfirmed()` | N/A (boolean return) |7879## Quick Template Reference8081### Entity skeleton8283```php84final class {Name}85{86 private {Name}Status $status;87 private DateTimeImmutable $createdAt;88 private ?DateTimeImmutable $updatedAt = null;8990 public function __construct(91 private readonly {Name}Id $id,92 {constructorProperties}93 ) {94 {constructorValidation}95 $this->status = {Name}Status::default();96 $this->createdAt = new DateTimeImmutable();97 }9899 public function id(): {Name}Id { return $this->id; }100 public function status(): {Name}Status { return $this->status; }101102 {behaviorMethods}103104 private function touch(): void { $this->updatedAt = new DateTimeImmutable(); }105}106```107108### Test skeleton109110```php111#[Group('unit')]112#[CoversClass({Name}::class)]113final class {Name}Test extends TestCase114{115 public function testCreatesWithValidData(): void116 {117 $entity = $this->createEntity();118 self::assertInstanceOf({Name}Id::class, $entity->id());119 self::assertSame({Name}Status::default(), $entity->status());120 }121122 {behaviorTests}123124 private function createEntity(): {Name}125 {126 return new {Name}(id: {Name}Id::generate(), {testConstructorArgs});127 }128}129```130131## Usage132133To generate an Entity, provide:134- Name (e.g., "Order", "User")135- Bounded Context (e.g., "Order", "User")136- Identity type (e.g., "OrderId")137- States/Statuses138- Key behaviors needed139- Invariants to protect140141## References142143- `references/templates.md` — full PHP code templates (Entity, Test, State Transition Enum, design principle code samples)144- `references/examples.md` — complete Order Entity and User Entity implementation examples145146---147> Converted and distributed by [TomeVault](https://tomevault.io/claim/dykyi-roman) — claim your Tome and manage your conversions.148<!-- tomevault:4.0:skill_md:2026-04-11 -->