«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Упрощение передачи данных в Laravel с помощью DTO

Упрощение передачи данных в Laravel с помощью DTO

Опубликовано 7 ноября 2024 г.
Просматривать:190

Simplifying Data Transfer in Laravel with DTOs

Вот пошаговый пример создания объектов передачи данных (DTO) с использованием Данные Laravel:

1. Установить пакет данных Laravel

Для начала установите пакет spatie/laravel-data с помощью Composer. Этот пакет помогает создавать DTO и эффективно управлять данными.

composer require spatie/laravel-data

2. Создание объекта передачи данных (DTO)

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

Выполните следующую команду Artisan, чтобы создать новый класс DTO:

php artisan make:data UserData

Это создаст класс UserData внутри каталога App/Data.

3. Определение свойств и типов в DTO

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

namespace App\Data;

use Spatie\LaravelData\Data;

class UserData extends Data
{
    public function __construct(
        public string $name,
        public string $email,
        public string $address,
        public ?string $phone = null  // Optional phone field
    ) {}
}

Объяснение:

  • Метод __construct автоматически присваивает входящие значения свойствам DTO.
  • Строка $phone = null указывает, что свойство телефона является необязательным.

4. Используйте DTO в контроллере

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

namespace App\Http\Controllers;

use App\Data\UserData;
use App\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function store(Request $request)
    {
        // Validate the incoming request data
        $validatedData = $request->validate([
            'name' => 'required|string',
            'email' => 'required|email',
            'address' => 'required|string',
            'phone' => 'nullable|string',
        ]);

        // Create a UserData DTO
        $userData = UserData::from($validatedData);

        // You can now access $userData->name, $userData->email, etc.
        User::create([
            'name' => $userData->name,
            'email' => $userData->email,
            'address' => $userData->address,
            'phone' => $userData->phone,
        ]);

        return response()->json(['message' => 'User created successfully']);
    }
}

Объяснение:

  • Метод UserData::from() автоматически отображает проверенные данные запроса в объект DTO.
  • Объект DTO теперь можно использовать для передачи данных между контроллером и моделью (или другими уровнями приложения).

5. Преобразование данных с помощью DTO

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

public function show(User $user)
{
    // Convert the User model to UserData DTO
    $userData = new UserData(
        name: $user->name,
        email: $user->email,
        address: $user->address,
        phone: $user->phone
    );

    return response()->json($userData);
}

Объяснение:

  • Здесь мы вручную создаем UserData DTO, передавая свойства модели User в конструктор DTO.
  • Этот DTO может быть возвращен непосредственно в виде ответа JSON, обеспечивая структурированный формат данных.

6. DTO с коллекциями

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

public function index()
{
    $users = User::all();

    // Convert the collection of User models to a collection of UserData DTOs
    $userCollection = UserData::collection($users);

    return response()->json($userCollection);
}

Объяснение:

  • Метод UserData::collection($users) сопоставляет каждую модель User с DTO UserData, преобразуя всю коллекцию в список DTO.

7. Настройте преобразование данных

Пакет spatie/laravel-data позволяет настраивать преобразование, например переименовывать атрибуты или добавлять вычисляемые поля.

class UserData extends Data
{
    public function __construct(
        public string $name,
        public string $email,
        public string $address,
        public ?string $phone = null
    ) {}

    // Add a custom method to compute a full contact string
    public function fullContact(): string
    {
        return "{$this->name} ({$this->email})";
    }
}

Теперь вы можете использовать fullContact() для получения строки пользовательского форматирования при работе с этим DTO.

8. Проверка данных и DTO

Вы можете добавить правила проверки непосредственно в DTO, используя функцию правил Laravel Data.

namespace App\Data;

use Spatie\LaravelData\Attributes\Validation\Email;
use Spatie\LaravelData\Attributes\Validation\Required;
use Spatie\LaravelData\Data;

class UserData extends Data
{
    public function __construct(
        #[Required] public string $name,
        #[Email] public string $email,
        public string $address,
        public ?string $phone = null
    ) {}
}

Объяснение:

  • С помощью атрибутов проверки, таких как #[Required] и #[Email], вы можете обеспечить проверку непосредственно на уровне DTO, еще больше упрощая процесс.

Заключение

В этом практическом руководстве мы рассмотрели, как создавать и использовать объекты передачи данных (DTO) с помощью данных Laravel. С помощью шаблона DTO вы можете четко управлять данными и преобразовывать их, гарантируя разделение задач между уровнями вашего приложения и одновременно упрощая обслуживание кода. Пакет spatie/laravel-data упрощает управление DTO, предлагая простые в использовании функции как для разработчиков, так и для крупномасштабных приложений.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/mdarifulhaque/simplifying-data-transfer-in-laravel-with-dtos-1il7?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3