• Час читання ~3 хв
  • 10.10.2023

Вступ

Об'єкт передачі даних (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
}

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

new CreateUserDTO(...$request->all()) ми використовуємо іменовані аргументи з PHP 8 для створення екземпляра .CreateUserDTO

За допомогою цього ми вирішуємо питання, які детально описали в попередньому розділі. Ваш код тепер має покращену якість та зручність супроводу.

Висновок

У цій статті ми дізналися, що таке об'єкти передачі даних, чому ми повинні використовувати їх у наших програмах і як їх використовувати в Laravel.

Якщо ви хочете почати використовувати DTO у своїх додатках, я створив цей пакет, який є простим способом почати використовувати DTO, надавши базовий клас DTO з перевіркою та типуванням з коробки, а також ремісничу команду для створення ваших 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