creating-domain-modellisted
Install: claude install-skill maiobarbero/laravel-boost-ddd
# 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 se