Вступ
Об'єкт передачі даних (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
перевірки. Але це створює інші проблеми:
-
Перевірка даних тепер пов'язана з HTTP-запитом. Якщо мені потрібно викликати
createUser
метод з мого коду, мені потрібно буде знову перевірити дані вручну. -
У вас є відображення даних, але оскільки масив
$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.
Сподіваюся, що вам сподобалася ця стаття, і якщо так, то не забудьте поділитися цією статтею з друзями!! Бувай!