AGENT SKILL
laravel-clean-architecture
Expert patterns for DDD, DTOs, and Ports & Adapters in Laravel. Use when applying Domain-Driven Design, DTOs, or ports-and-adapters patterns in Laravel. (triggers: app/Domains/**/*.php, app/Providers/*.php, domain, dto, repository, contract, adapter)
使用场景视觉设计
- License 许可
- MIT
- 最近更新
- 2026-06-24
- Stars
- ★ 67
- Forks
- 24
01 前言 Front Matter
- name
- laravel-clean-architecture
- description
- Expert patterns for DDD, DTOs, and Ports & Adapters in Laravel. Use when applying Domain-Driven Design, DTOs, or ports-and-adapters patterns in Laravel. (triggers: app/Domains/**/*.php, app/Providers/*.php, domain, dto, repository, contract, adapter)
02 资源文件 5
- 其他customize.toml1.6 KB
- 参考文档project-context-template.md467 B
- 参考文档steps/step-01-discover.md6.3 KB
- 参考文档steps/step-02-generate.md9.4 KB
- 参考文档steps/step-03-complete.md8.1 KB
03 SKILL.md 正文
Laravel Clean Architecture
Priority: P1 (HIGH)
Structure
app/
├── Domains/ # Logic grouped by business domain
│ └── {Domain}/
│ ├── Actions/ # Single use-case logic
│ ├── DTOs/ # Immutable data structures
│ └── Contracts/ # Interfaces for decoupling
└── Providers/ # Dependency bindings
Implementation Guidelines
Domain-Driven Design (DDD)
- Grouping: Organize code in
app/Domains/Order/{Actions,DTOs,Contracts}/. Group by business domain (User, Order, Payment) — not by type (Controllers, Models). - Core Models: Keep standard Eloquent models in
app/Models/. - Separation: Never put Eloquent queries in controllers; delegate to Action classes for use-case logic.
Data Transfer Objects (DTOs)
- Immutability: Create typed readonly DTOs:
Immutable by default in PHP 8.1+. DTOs cross boundaries — pass between layers instead of raw arrays or Eloquent models. No raw arrays between layers.readonly class OrderData { public function __construct( public readonly string $title, public readonly int $amount ) {} } readonly class CreateOrderData { public function __construct( public readonly string $customerId, public readonly int $amount ) {} }
Repository Pattern & Decoupling
- Interfaces: Create
Contracts/OrderRepository interfaceand implementEloquentOrderRepository. - Binding: Bind interfaces to implementations in
AppServiceProvidervia$this->app->bind(OrderRepository::class, EloquentOrderRepository::class). - Usage: Inject interfaces into your actions/services.
- Layer Flow: Controller → Action → Repository Interface → Eloquent. DTOs cross boundaries at every layer transition.
Anti-Patterns
- No Eloquent in Controllers: Bridge layers with DTOs and Actions.
- No raw arrays across layers: Use typed
readonlyDTOs. - No God Services: Break into single-responsibility Actions.
- No concrete dependencies: Depend on Interfaces, not implementations.