Что такое DTO?

«Что такое DTO?» — вопрос из категории Архитектура, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

DTO (Data Transfer Object) — это шаблон проектирования, представляющий собой простой объект, предназначенный для передачи данных между подсистемами приложения (например, между слоем контроллера и сервисом или между микросервисами). Его ключевая цель — уменьшить количество вызовов методов при передаче данных, объединяя их в один объект.

Основные характеристики DTO:

  • Только данные: Содержит только поля (свойства) и методы для доступа к ним (геттеры/сеттеры), но не содержит бизнес-логики.
  • Иммутабельность: Часто делается неизменяемым (immutable) после создания для обеспечения потокобезопасности и предсказуемости.
  • Сериализуемость: Легко преобразуется в форматы для передачи (JSON, XML).

Зачем использовать DTO?

  1. Разделение ответственности: Отделяет модель данных, используемую для передачи, от внутренней доменной модели (Entity).
  2. Безопасность: Позволяет контролировать, какие данные "уходят" наружу. Например, можно исключить поля password или internalId при отправке клиенту.
  3. Согласованность API: Гарантирует, что клиенты получают данные в строго определённой структуре.
  4. Оптимизация: Позволяет агрегировать данные из нескольких сущностей в один объект для одного сетевого запроса.

Пример на 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);