creating-action ยท diff
git:20260922.00e7bbe to git:20260922.7ecf42a
16 added, 27 removed. Audit A to A.
---
name: creating-action
- description: Create an Application Action representing one application use case.
+ description: Create, modify, or refactor application use cases into Laravel-native DDD Actions. Use for business operations such as placing or cancelling orders, extracting controller orchestration, and fixing use-case behavior.
---
- # Creating an Action
-
- Use an Action for one application use case.
-
- Place it under:
-
- App\Application\<Capability>\Actions
-
- Use a verb-oriented name describing the operation:
+ # Creating and changing Actions
- - PlaceOrder
- - CancelOrder
- - RegisterCustomer
+ Use `App\Application\<Capability>\Actions`, a verb-oriented name such as `CancelOrder` (no `Action` suffix), and a public `handle()` method. Actions are normally final. Preserve legacy locations unless migration is in scope.
- Do not add the `Action` suffix.
+ ## Responsibilities
- Expose the use case through:
+ 1. Accept explicit input and an actor when authorization is required; never a FormRequest or an implicit HTTP user.
+ 2. Load the relevant models and authorize the use case with `Gate::forUser($actor)` and Laravel policies. Authentication stays in the entry point.
+ 3. Invoke domain behavior, then persist: `$order->cancel(); $order->save();`.
+ 4. Own a transaction when coordinated writes require atomicity. Keep external calls outside it where possible.
+ 5. Coordinate dispatch of events, whether produced by Domain or constructed by Application, ensuring external reactions happen after commit.
- public function handle(...)
+ Domain invariants and domain exceptions belong to Domain; orchestration belongs here. Return models, values, or application results, never HTTP responses or Resources. Use a Data object only for meaningful structured input.
- Actions should normally be final.
+ Inject consumer-owned contracts for Infrastructure dependencies. Bind implementations in a service provider; do not resolve concrete adapters through `app()`, strings, or custom facades. Direct Eloquent, `DB`, and `Gate` remain available within these responsibilities.
- An Action may:
+ For follow-up asynchronous work, prefer events. Do not reference `App\Jobs` from an Action. A contract is justified only when it represents a real infrastructure capability.
- - load Domain models
- - invoke Domain behavior
- - coordinate multiple domain objects
- - manage application-level orchestration
+ Actions may invoke another complete use case, retaining its authorization checks. Avoid chains of tiny Actions; the outer Action owns transaction coordination. Models from another capability may be used directly within the same bounded context.
- An Action must not:
+ Simple authorized reads may remain in an entry point. Do not introduce an Action for every query or trivial framework operation.
- - accept FormRequest objects
- - return HTTP responses or Resources
- - contain presentation logic
+ ## Connected example
- Keep business rules in the Domain when they belong to the business rather than to application orchestration.
+ Read [the order cancellation example](references/order-cancellation.md) when implementing or reviewing the relationship between authorization, model behavior, persistence, events, and tests. It demonstrates a transaction for an order update plus an audit record, without requiring a DTO, repository, or event collector.