IT-aутстафферы из Тулы💚
https://evapps.ru/
Здесь пишем про веб- и мобильную разработку
▶️ Наш чат для системных аналитиков: https://t.me/pro_sa_evapps
▶️ Посмотреть, как мы живём: https://vk.com/evapps
Post #1461
280
Всем привет!
На связи снова разработчики EvApps💪
Сегодня поговорим про DTO (Data Transfer Objects), а именно разберем, зачем и как использовать его в Laravel.
⭕️ DTO (Объект Передачи Данных) - это шаблон проектирования, используемый для передачи данных между уровнями в программной архитектуре. Основная цель DTO - отделить различные уровни или компоненты приложения, позволяя им взаимодействовать друг с другом, не вникая в детали реализации друг друга.
Итак, DTO - это простой объект передачи данных, который помогает отделить и изолировать компоненты друг от друга.
Если мы знаем структуру данных используемую в конкретном участке кода, то нам легко его поддерживать и изменять, тут нам и помогает DTO.
❇️ Например, код контроллера сохранения статьи:
В данном примере мы не знаем, что вернет метод $request->all().
Мы можем создать свой класс CreateArticleRequest и, при необходимости, смотреть, что он возвращает. Но теперь валидация данных связана с HTTP Request, и если нам нужно вызвать метод createArticle в другом месте кода, то нужно будет вручную передавать объект CreateArticleRequest. К тому же, класс CreateArticleRequest вернёт массив полей и мы не можем принудительно указать тип данных передаваемых в метод createArticle.
Используя DTO мы решим проблемы описанные выше.
⭕️ Как использовать?
Как мы сказали выше, DTO - это простой объект для сопоставления свойств.
❇️ Создадим класс DTO:
В объявлении класса DTO используем ключевые слова final readonly, то есть запрещаем наследовать класс DTO и переопределять свойства объекта, поэтому после создания класса DTO его контекст нельзя будет изменить, и мы можем быть уверены, что получим на вход именно нашу DTO, которую указали в контракте метода createArticle. Эти действия позволят нам использовать контекстный объект и добавить безопасность типов.
Контроллер теперь выглядит вот так:
Благодаря именованным аргументам в PHP8 мы легко создаем экземпляр CreateArticleDTO, используя конструкцию new CreateArticleDTO (...$request->all())
Такой подход использования DTO позволяет решить проблемы:
✅ Мы всегда знаем какие данные получит метод;
✅ Мы явно указываем тип переданных данных;
✅ Мы не привязаны к объекту CreateArticleRequest и можем вызвать createArticle в любом месте нашего кода.
Теперь код стал более качественным и поддерживаемым👍
❓А вы в своих Laravel-проектах используете DTO или работаете напрямую с массивами/Request?
#PHP #Laravel #DTO #backend #паттерны_проектирования #чистый_код #туториал
На связи снова разработчики EvApps💪
Сегодня поговорим про DTO (Data Transfer Objects), а именно разберем, зачем и как использовать его в Laravel.
⭕️ DTO (Объект Передачи Данных) - это шаблон проектирования, используемый для передачи данных между уровнями в программной архитектуре. Основная цель DTO - отделить различные уровни или компоненты приложения, позволяя им взаимодействовать друг с другом, не вникая в детали реализации друг друга.
Итак, DTO - это простой объект передачи данных, который помогает отделить и изолировать компоненты друг от друга.
Если мы знаем структуру данных используемую в конкретном участке кода, то нам легко его поддерживать и изменять, тут нам и помогает DTO.
❇️ Например, код контроллера сохранения статьи:
public function store(Request $request): JsonResponse
{
return response()->json([
$this->service->createArticle($request->all()),
Response::HTTP_CREATED
]);
}
В данном примере мы не знаем, что вернет метод $request->all().
Мы можем создать свой класс CreateArticleRequest и, при необходимости, смотреть, что он возвращает. Но теперь валидация данных связана с HTTP Request, и если нам нужно вызвать метод createArticle в другом месте кода, то нужно будет вручную передавать объект CreateArticleRequest. К тому же, класс CreateArticleRequest вернёт массив полей и мы не можем принудительно указать тип данных передаваемых в метод createArticle.
Используя DTO мы решим проблемы описанные выше.
⭕️ Как использовать?
Как мы сказали выше, DTO - это простой объект для сопоставления свойств.
❇️ Создадим класс DTO:
final readonly class CreateArticleDTO
{
public function __construct(
public string $title,
public string $description,
public string $body,
) {}
}
В объявлении класса DTO используем ключевые слова final readonly, то есть запрещаем наследовать класс DTO и переопределять свойства объекта, поэтому после создания класса DTO его контекст нельзя будет изменить, и мы можем быть уверены, что получим на вход именно нашу DTO, которую указали в контракте метода createArticle. Эти действия позволят нам использовать контекстный объект и добавить безопасность типов.
Контроллер теперь выглядит вот так:
public function store(Request $request): JsonResponse
{
return response()->json([
$this->service->createArticle(new CreateArticleDTO(...$request->all())),
Response::HTTP_CREATED
]);
}
Благодаря именованным аргументам в PHP8 мы легко создаем экземпляр CreateArticleDTO, используя конструкцию new CreateArticleDTO (...$request->all())
Такой подход использования DTO позволяет решить проблемы:
✅ Мы всегда знаем какие данные получит метод;
✅ Мы явно указываем тип переданных данных;
✅ Мы не привязаны к объекту CreateArticleRequest и можем вызвать createArticle в любом месте нашего кода.
Теперь код стал более качественным и поддерживаемым👍
❓А вы в своих Laravel-проектах используете DTO или работаете напрямую с массивами/Request?
#PHP #Laravel #DTO #backend #паттерны_проектирования #чистый_код #туториал
- 🔥 3
- 🤔 1












