DTO в языке PHP: примеры для начинающих

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Недавно объяснял нашим джунам, что такое DTO и как его лучше применять. Потом решил, что быть примеры окажутся полезными для кого-либо еще. Поэтому оставляю здесь.

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



В PHP DTO может быть реализован как класс с публичными свойствами, которые соответствуют данным, которые нужно передать. DTO может использоваться для передачи данных между слоями приложения, такими как контроллеры, сервисы, хранилища и т. д.

DTO обычно используется для уменьшения связности между слоями приложения и улучшения модульности, позволяя каждому слою обрабатывать только необходимые данные, а также обеспечивая более явное определение данных, которые передаются между слоями.

Самый простой пример реализации DTO в PHP:

class UserDTO {
    public $id;
    public $name;
    public $email;

    public function __construct($id, $name, $email) {
        $this->id = $id;
        $this->name = $name;
        $this->email = $email;
    }
}


В данном примере создается DTO для пользователя, который содержит свойства «id», «name» и «email». Конструктор класса принимает значения для этих свойств и инициализирует их в объекте.

Для передачи данных из базы данных в контроллер можно использовать следующий код:

class UserController {
    public function getUser($userId) {
        $userData = // получение данных о пользователе из базы данных
        $user = new UserDTO($userData['id'], $userData['name'], $userData['email']);
        return $user;
    }
}

В данном примере метод «getUser» контроллера получает данные о пользователе из базы данных и создает объект DTO «UserDTO» с этими данными. Этот объект затем возвращается из метода и может использоваться другими слоями приложения.

Или еще пример. Предположим, у вас есть веб-приложение, которое содержит страницу, на которой пользователь может создавать новый профиль. Когда пользователь заполняет форму для создания профиля и отправляет ее, данные из формы должны быть переданы на сервер для обработки. В этом случае можно использовать DTO для передачи данных между слоями приложения.

class UserProfileDTO {
    public $firstName;
    public $lastName;
    public $email;
    public $password;
}


После того, как пользователь отправил форму, данные из формы могут быть использованы для создания объекта DTO «UserProfileDTO» и переданы на сервер для обработки:

// Создаем объект DTO на основе данных из формы
$userProfile = new UserProfileDTO();
$userProfile->firstName = $_POST['first_name'];
$userProfile->lastName = $_POST['last_name'];
$userProfile->email = $_POST['email'];
$userProfile->password = $_POST['password'];

// Передаем объект DTO на сервер для обработки
$userService = new UserService();
$userService->createUserProfile($userProfile);


В этом примере данные из формы используются для создания объекта DTO «UserProfileDTO», который затем передается на сервер для обработки через сервис «UserService». Объект DTO облегчает передачу данных между слоями приложения и уменьшает связность между ними.

Когда же применять DTO

Набросал небольшой список — перечень этот открытый и все случаи сложно обозреть. Обычно DTO используется в случаях, когда:

  1. Необходимо передать данные между различными слоями приложения. Например, данные, полученные из базы данных, могут быть переданы контроллеру, который затем обрабатывает эти данные и передает их сервису.
  2. Необходимо уменьшить связность между слоями приложения. Использование DTO позволяет каждому слою обрабатывать только необходимые данные и не зависеть от других слоев.
  3. Необходимо более явно определить данные, которые передаются между слоями. DTO позволяет определить явно, какие данные передаются между слоями приложения, что делает код более понятным и легко поддерживаемым.
  4. Необходимо обеспечить безопасность данных. Использование DTO может помочь защитить данные, так как только определенные свойства объекта DTO могут быть переданы между слоями приложения.
  5. Необходимо передать данные между различными языками программирования. Использование DTO позволяет определить явно формат данных, что упрощает их пересылку между различными языками.
  6. Необходимо передать данные по сети или между различными приложениями. Использование DTO может помочь определить формат данных, которые должны быть переданы между приложениями, что упрощает их обмен.
  7. Необходимо передать только определенные свойства объекта между слоями приложения. DTO позволяет определить явно, какие свойства объекта должны быть переданы между слоями приложения, что уменьшает объем передаваемых данных и может улучшить производительность.
  8. Необходимо сократить количество запросов к базе данных. Использование DTO может помочь уменьшить количество запросов к базе данных, так как можно передавать только необходимые данные между слоями приложения.
  9. Необходимо обработать большие объемы данных. Использование DTO может помочь упростить обработку больших объемов данных, так как можно определить явно, какие данные должны быть обработаны в каждом слое приложения.
  10. Необходимо предотвратить возможные ошибки при передаче данных между слоями. Использование DTO может помочь предотвратить возможные ошибки при передаче данных между слоями приложения, так как определение формата данных становится более явным и четким.


Как сказано выше, DTO может быть полезным при передаче данных из PHP в Go, так как эти два языка имеют различные типы данных и форматы сериализации, которые могут затруднить передачу данных между ними. Использование DTO позволяет определить явно формат данных, которые должны быть переданы между PHP и Go, что упрощает их обмен.

Вот один из примеров “межъязыкового” взаимодействия с помощью DTO (пример взят из одной популярной библиотеки):

 class UserDTO {
    public $id;
    public $name;
    public $email;
    public $phone;

    public function __construct($id, $name, $email, $phone) {
        $this->id = $id;
        $this->name = $name;
        $this->email = $email;
        $this->phone = $phone;
    }

    public function toJson() {
        return json_encode([
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'phone' => $this->phone,
        ]);
    }
}


В данном примере создается DTO для пользователя, который содержит свойства «id», «name», «email» и «phone». Конструктор класса принимает значения для этих свойств и инициализирует их в объекте. Также есть метод «toJson», который преобразует объект DTO в формат JSON.

Для передачи данных из PHP в Go можно использовать следующий код:

$userProfile = new UserDTO(1, 'John Doe', 'johndoe@example.com', '555-1234');
$data = $userProfile->toJson();

// Отправляем данные в Go через gRPC
$client = new UserProfileClient('localhost:50051', [
    'credentials' => Grpc\ChannelCredentials::createInsecure(),
]);
$request = new SaveUserProfileRequest();
$request->setData($data);
$response = $client->SaveUserProfile($request);


В данном примере объект DTO «UserDTO» преобразуется в формат JSON с помощью метода «toJson», затем данные передаются в Go приложение через gRPC. На стороне Go данные могут быть десериализованы из JSON и использованы в соответствующих целях.

Таким образом, использование DTO может помочь упростить передачу данных между PHP и Go, определяя явно формат данных, которые должны быть переданы между ними.

Продолжение следует…
Источник: https://habr.com/ru/post/721122/


Интересные статьи

Интересные статьи

Мы уже рассказывали об энтузиастах, которые проектируют DIY-инструменты или возвращают к жизни забытые муз. девайсы по изображениям и описаниям.Продолжим тему и поговорим о парочке необычных инструмен...
Хочу представить вам свой проект – библиотеку RUI (Remote User Interface). Библиотека предназначена для создания web-приложений на языке go.  Особенностью библиотеки заключается в том, что вся об...
Когда я впервые попробовал использовать переменные CSS, у меня не было полного представления об их возможностях. Правильное их использование позволяет существенно сократи...
Сегодня, в 10 уроке курса по Vue, мы поговорим о том, как работать с формами. Формы позволяют собирать данные, вводимые пользователем. Кроме того, здесь мы обсудим валидацию форм, то ...
Здравствуйте. Я уже давно не пишу на php, но то и дело натыкаюсь на интернет-магазины на системе управления сайтами Битрикс. И я вспоминаю о своих исследованиях. Битрикс не любят примерно так,...