Зачем нужен
- Изолирует внутреннюю модель от внешнего 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/шаблоне