Вот пошаговый пример создания объектов передачи данных (DTO) с использованием Данные Laravel:
Для начала установите пакет spatie/laravel-data с помощью Composer. Этот пакет помогает создавать DTO и эффективно управлять данными.
composer require spatie/laravel-data
После установки пакета мы можем создать класс DTO для обработки передачи данных. Предположим, у нас есть сущность User, и мы хотим создать DTO для передачи пользовательских данных.
Выполните следующую команду Artisan, чтобы создать новый класс DTO:
php artisan make:data UserData
Это создаст класс UserData внутри каталога App/Data.
Теперь давайте отредактируем класс 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 ) {} }
Теперь, когда объект 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']); } }
Вы также можете использовать 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); }
Если вы работаете с коллекциями данных, например, получаете список пользователей, пакет 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); }
Пакет 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.
Вы можете добавить правила проверки непосредственно в 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 ) {} }
В этом практическом руководстве мы рассмотрели, как создавать и использовать объекты передачи данных (DTO) с помощью данных Laravel. С помощью шаблона DTO вы можете четко управлять данными и преобразовывать их, гарантируя разделение задач между уровнями вашего приложения и одновременно упрощая обслуживание кода. Пакет spatie/laravel-data упрощает управление DTO, предлагая простые в использовании функции как для разработчиков, так и для крупномасштабных приложений.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3