• Время чтения ~3 мин
  • 10.10.2023

Введение

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

Что такое объект

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

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

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

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

Огромную роль в этом играют стандарты структуры данных. Если я знаю структуру данных, используемую в фрагменте кода, то ее очень легко поддерживать, а также легко изменять, и именно здесь в игру вступают DTO.

Допустим, у меня есть такой код:

class UserController extends Controller
{
    public function store(Request $request): JsonResponse
    {
        return response()->json([
            $this->service->createUser($request->all()),
            Response::HTTP_CREATED
        ]);
    }
}

Даже если это простой кусок кода, если я создал его год назад, а теперь мне нужно изменить createUser метод, я, вероятно, не запомню, какие данные $request->all() возвращает метод.

Я мог бы выполнить рефакторинг для использования класса Custom Request:

class UserController extends Controller
{
    public function store(CreateUserRequest $request): JsonResponse
    {
        return response()->json([
            $this->service->createUser($request->validated()),
            Response::HTTP_CREATED
        ]);
    }
}

С приведенным выше кодом, если бы мне нужно было обновить метод, и я не помню, какие данные он использует, createUser я мог бы перейти к CreateUserRequest проверке. Но это создает другие проблемы:

  1. Проверка данных теперь связана с HTTP-запросом. Если мне нужно вызвать createUser метод из моего кода, мне нужно будет снова проверить данные вручную.

  2. Данные сопоставлены, но так как возвращает $request->validated() массив, вы не можете принудительно задать тип данных, передаваемых методуcreateUser.

Если мы применим здесь паттерн DTO, мы сможем решить обе проблемы, описанные выше. Вместо этого мы можем сопоставить и проверить данные в DTO, поэтому, если мне нужно вызвать createUser метод из моего кода, проверка будет выполнена автоматически, так как мне нужно передать DTO в метод, а также принудительно определит тип данных, которые мы могли бы передать методуcreateUser, поскольку теперь нам нужно будет передать для него определенный DTO.

Как использовать DTO Как объяснялось выше, DTO

могут быть простыми объектами для сопоставления свойств. Таким образом, самой простой реализацией DTO было бы создание простого класса, подобного следующему:Затем вы можете создать свой DTO из Request:Here:

class CreateUserDTO
{
    public function __construct(
        private string $name,
        private string $email,
        private string $username,
        private string $password
    ) {}
    // Add getters, setters, validation
}

new CreateUserDTO(...$request->all())

class UserController extends Controller
{
    public function store(Request $request): JsonResponse
    {
        return response()->json([
            $this->service->createUser(new CreateUserDTO(...$request->all())),
            Response::HTTP_CREATED
        ]);
    }
}

мы используем именованные аргументы из PHP 8 для создания экземпляра .

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

Заключение

В этой статье мы узнали, что такое объекты передачи данных, почему мы должны использовать их в наших приложениях и как использовать их в Laravel.

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

Я надеюсь, что вам понравилась эта статья, и если она вам понравилась, не забудьте поделиться этой статьей со своими друзьями!! Увидимся!

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Об авторе CrazyBoy49z
WORK EXPERIENCE
Контакты
Ukraine, Lutsk
+380979856297