Awesome-claude-code create-dto
Generates DTO (Data Transfer Object) for PHP 8.4. Creates immutable objects for layer boundaries, API requests/responses, and data serialization. Includes unit tests.
install
source · Clone the upstream repo
git clone https://github.com/dykyi-roman/awesome-claude-code
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/dykyi-roman/awesome-claude-code "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/create-dto" ~/.claude/skills/dykyi-roman-awesome-claude-code-create-dto && rm -rf "$T"
manifest:
skills/create-dto/SKILL.mdsource content
DTO Generator
Generate DTOs for transferring data between layers, API boundaries, and external systems.
DTO Characteristics
- Immutable: Read-only after creation
- No Behavior: Pure data container, no business logic
- Serializable: JSON/array conversion support
- Typed: Strictly typed properties
- Validated: Input validation at creation (for requests)
- Layer-Specific: Different DTOs for different purposes
DTO Types
| Type | Purpose | Location |
|---|---|---|
| Request DTO | API input validation | Presentation layer |
| Response DTO | API output formatting | Presentation layer |
| Command DTO | Use case input | Application layer |
| Query Result DTO | Read model output | Application layer |
| Integration DTO | External API data | Infrastructure layer |
Generation Process
Step 1: Identify DTO Type
Determine the purpose and layer for the DTO.
Step 2: Generate DTO Class
Path based on type:
- Request:
src/Presentation/Api/{Context}/Request/ - Response:
src/Presentation/Api/{Context}/Response/ - Application:
src/Application/{Context}/DTO/ - Integration:
src/Infrastructure/ExternalApi/{Service}/DTO/
Step 3: Add Conversion Methods
— Create from raw datafromArray()
— Create from domain entity (Response DTOs)fromEntity()
/toArray()
— Serialize for outputjsonSerialize()
Step 4: Generate Tests
Path:
tests/Unit/{Layer}/{Context}/{Type}/
File Placement
| Type | Path |
|---|---|
| Request DTO | |
| Response DTO | |
| Application DTO | |
| Integration DTO | |
| Unit Tests | |
Naming Conventions
| Type | Pattern | Example |
|---|---|---|
| Request | | , |
| Response | | , |
| Collection | | |
| Application | | , |
| Integration | | |
Quick Template Reference
Request DTO
final readonly class {Name}Request { public function __construct( #[Assert\NotBlank] public string $field, #[Assert\Valid] public ?NestedRequest $nested = null ) {} public static function fromArray(array $data): self; }
Response DTO
final readonly class {Name}Response implements \JsonSerializable { public function __construct( public string $id, public string $name, /** @var array<ItemResponse> */ public array $items = [] ) {} public static function fromEntity({Entity} $entity): self; public function jsonSerialize(): array; }
Application DTO
final readonly class {Name}DTO { public function __construct( public string $id, public string $field ) {} public static function fromRequest({Name}Request $request): self; public function toArray(): array; }
Anti-patterns to Avoid
| Anti-pattern | Problem | Solution |
|---|---|---|
| Business Logic | DTO with calculations | Keep DTOs data-only |
| Mutable DTO | setters, state changes | Use readonly, immutable |
| Domain Objects | Returning entities from API | Map to Response DTO |
| Anemic Validation | No input validation | Use Assert attributes |
| Deep Nesting | Complex nested DTOs | Flatten or split |
| Missing Serialization | No JSON support | Implement JsonSerializable |
References
For complete PHP templates and examples, see:
— Request, Response, Application, Collection, Integration DTO templatesreferences/templates.md
— Order, User, Payment examples and testsreferences/examples.md