Навіщо потрібен
- Ізолює внутрішню модель від зовнішнього API — зміна структури БД не зламає відповідь API
- Явно документує, які дані передаються між шарами
- Зручний для валідації вхідних даних (Request DTO) і формування відповідей (Response DTO)
Приклад
class CreateUserDTO {
public function __construct(
public readonly string $name,
public readonly string $email,
public readonly string $password,
) {}
}
DTO vs Entity vs ViewModel
- Entity — об'єкт доменної моделі з ідентичністю (є в БД)
- DTO — контейнер для передачі без ідентичності
- ViewModel — DTO спеціально для відображення в UI/шаблоні