Ответ
DTO (Data Transfer Object) — это шаблон проектирования, представляющий собой простой объект, предназначенный для передачи данных между подсистемами приложения (например, между слоем контроллера и сервисом или между микросервисами). Его ключевая цель — уменьшить количество вызовов методов при передаче данных, объединяя их в один объект.
Основные характеристики DTO:
- Только данные: Содержит только поля (свойства) и методы для доступа к ним (геттеры/сеттеры), но не содержит бизнес-логики.
- Иммутабельность: Часто делается неизменяемым (immutable) после создания для обеспечения потокобезопасности и предсказуемости.
- Сериализуемость: Легко преобразуется в форматы для передачи (JSON, XML).
Зачем использовать DTO?
- Разделение ответственности: Отделяет модель данных, используемую для передачи, от внутренней доменной модели (Entity).
- Безопасность: Позволяет контролировать, какие данные "уходят" наружу. Например, можно исключить поля
passwordилиinternalIdпри отправке клиенту. - Согласованность API: Гарантирует, что клиенты получают данные в строго определённой структуре.
- Оптимизация: Позволяет агрегировать данные из нескольких сущностей в один объект для одного сетевого запроса.
Пример на PHP (с использованием конструктора для иммутабельности):
class UserProfileDTO
{
public function __construct(
public readonly int $id,
public readonly string $username,
public readonly string $email,
public readonly DateTimeImmutable $registeredAt
) {}
}
// Создание DTO из Entity
$userEntity = $userRepository->find(1);
$userProfile = new UserProfileDTO(
$userEntity->getId(),
$userEntity->getUsername(),
$userEntity->getEmail(),
$userEntity->getCreatedAt()
);
// Сериализация для ответа API (например, в JSON)
echo json_encode($userProfile);