Generates DDD Entities for PHP 8.4. Creates identity-based objects with behavior, state transitions, and invariant protection. Includes unit tests.
From accnpx claudepluginhub dykyi-roman/awesome-claude-code --plugin accThis skill uses the workspace's default tool permissions.
references/examples.mdreferences/templates.mdGenerate DDD-compliant Entities with identity, behavior, and tests.
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 |
| 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 |
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.
Every mutation method must validate business rules before making changes. Common invariants:
Use a Status enum with explicit transition rules. The enum defines canTransitionTo() to enforce valid state machines. Entities delegate transition validation to the enum.
When asked to create an Entity:
| 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) |
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(); }
}
#[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});
}
}
To generate an Entity, provide:
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 examplesProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.