Skip to content
Back to skills

Creating Domain Model

ASecurity

Create, extend, or fix Eloquent business models and their state transitions. Use when moving business rules out of controllers or Actions, or explicitly migrating a model into a DDD capability.

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 29, 2026
ai-agentsphpdatabase

Security analysis

A100/100

Scanned September 29, 2026

npx -y skills add maiobarbero/laravel-boost-ddd --skill creating-domain-model --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Creating Domain Model?

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

Security grade badge for Creating Domain Model
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/maiobarbero-creating-domain-model/badge)](https://www.skillsdirectory.com/skills/maiobarbero-creating-domain-model)

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: creating-domain-model
description: Create, extend, or fix Eloquent business models and their state transitions. Use when moving business rules out of controllers or Actions, or explicitly migrating a model into a DDD capability.
---

# Domain models

New adopted models live in `App\Domain\<Capability>\Models`. Eloquent entities are the default; do not split persistence models from domain entities without a concrete need. Extending an existing legacy model does not authorize relocating it.

Put behavior on the entity that owns its rules. Mutate state in the model; let the Action persist it:

```php
public function cancel(): void
{
    if ($this->status !== 'pending') {
        throw new OrderCannotBeCancelled();
    }

    $this->status = 'cancelled';
}
```

Here `OrderCannotBeCancelled` belongs to `App\Domain\Orders\Exceptions`. Use the project's existing enum/cast when applicable. No `save()`, HTTP response, `abort()`, policy invocation, or Infrastructure call belongs in this method. An Action calling it must explicitly save.

Domain may produce or record an event describing a transition; Application coordinates dispatch. Do not add an event collector or base aggregate solely for DDD.

Models may collaborate across capabilities in the same bounded context. Eloquent remains usable; repositories are not required for normal queries or persistence.

## Preserve Laravel behavior

When a model move is explicitly in scope:

- Keep factories in `database/factories`. Map the model to its factory with `UseFactory` or `newFactory()` when required, and map the factory back using its `$model` property or the installed version's equivalent.
- Keep policies in `app/Policies`; register them with `Gate::policy()` in a service provider when discovery no longer matches. Do not attach an outer policy dependency to a Domain model.
- Update and verify relationships, model imports, route binding, auth configuration if relevant, and persisted polymorphic type mappings if a stored class name changes.
- Verify factory creation, authorization, and affected behavior. Do not migrate unrelated models.

For the full sequence, see [order cancellation](../creating-action/references/order-cancellation.md).

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.