DTO (Data Transfer Object) в PHP — это простой объект, который используется для передачи данных между слоями и процессами приложения. DTO помогает уменьшить количество вызовов методов, путём объединения данных в один объект, что особенно полезно при работе с удалёнными интерфейсами или сложными структурами данных.
Преимущества использования DTO:
- Ясность и удобство: DTO определяет, какие данные будут переданы, что повышает читаемость и упрощает поддержку кода.
- Безопасность: Использование DTO позволяет избежать передачи доменных моделей напрямую, что может предотвратить случайное изменение данных.
- Гибкость: DTO может быть оптимизирован под конкретные нужды передачи данных, не влияя на структуру доменных моделей.
Реализация иммутабельных DTO:
Иммутабельность означает, что состояние объекта не может быть изменено после его создания. Иммутабельные DTO полезны для обеспечения безопасности и предсказуемости поведения данных в приложении.
- Определение свойств только для чтения: В PHP 7.4 и выше можно использовать типизированные свойства класса и объявить их как
private
, чтобы гарантировать, что они могут быть установлены только из конструктора класса. - Использование конструктора для инициализации: Все необходимые данные должны быть переданы через конструктор, который устанавливает значения для всех свойств. Поскольку свойства объявлены как
private
, они не могут быть изменены снаружи класса.
class UserDto {
private string $name;
private string $email;
public function __construct(string $name, string $email) {
$this->name = $name;
$this->email = $email;
}
public function getName(): string {
return $this->name;
}
public function getEmail(): string {
return $this->email;
}
}
- Отсутствие сеттеров: Для обеспечения иммутабельности объекта DTO избегайте определения методов-сеттеров, которые могли бы изменить его состояние после инициализации.
- Методы для создания изменённых копий: Если нужно изменить данные DTO, можно предоставить метод, который возвращает новый экземпляр DTO с изменёнными данными, оставляя исходный объект неизменным.
public function withEmail(string $newEmail): self {
return new self($this->name, $newEmail);
}
Использование иммутабельных DTO может значительно повысить надёжность и предсказуемость поведения вашего приложения, обеспечивая, что данные не будут изменены неожиданно.