"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Simplificando la transferencia de datos en Laravel con DTO

Simplificando la transferencia de datos en Laravel con DTO

Publicado el 2024-11-07
Navegar:328

Simplifying Data Transfer in Laravel with DTOs

Aquí hay un ejemplo paso a paso sobre cómo crear objetos de transferencia de datos (DTO) usando Laravel Data:

1. Instalar el paquete de datos de Laravel

Para comenzar, instale el paquete spatie/laravel-data usando Composer. Este paquete ayuda a crear DTO y administrar datos de manera eficiente.

composer require spatie/laravel-data

2. Crear un objeto de transferencia de datos (DTO)

Después de instalar el paquete, podemos crear una clase DTO para manejar la transferencia de datos. Supongamos que tenemos una entidad de usuario y queremos crear un DTO para transferir datos de usuario.

Ejecute el siguiente comando Artisan para generar una nueva clase DTO:

php artisan make:data UserData

Esto creará una clase UserData dentro del directorio App/Data.

3. Definir propiedades y tipos en DTO

Ahora, editemos la clase UserData para definir las propiedades y tipos de datos que espera para su 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
    ) {}
}

Explicación:

  • El método __construct asigna automáticamente los valores entrantes a las propiedades DTO.
  • La cadena $phone = null indica que la propiedad del teléfono es opcional.

4. Usar DTO en un controlador

Ahora que se creó el DTO UserData, podemos usarlo dentro de nuestro controlador para manejar los datos entrantes, transformarlos y pasarlos entre capas de la aplicación.

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']);
    }
}

Explicación:

  • El método UserData::from() asigna automáticamente los datos de la solicitud validada al objeto DTO.
  • El objeto DTO ahora se puede utilizar para transferir datos entre el controlador y el modelo (u otras capas de la aplicación).

5. Transformar datos usando DTO

También puede utilizar el DTO para transformar datos al devolver respuestas. Modifiquemos el método show en UserController para devolver datos del usuario a través del 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);
}

Explicación:

  • Aquí, creamos manualmente un DTO UserData pasando las propiedades del modelo de usuario al constructor DTO.
  • Este DTO se puede devolver directamente como una respuesta JSON, lo que garantiza un formato de datos estructurado.

6. DTO con colecciones

Si está trabajando con colecciones de datos, como buscar una lista de usuarios, el paquete DTO también proporciona un método simple para manejar colecciones.

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);
}

Explicación:

  • El método UserData::collection($users) asigna cada modelo de usuario al DTO UserData, transformando toda la colección en una lista de DTO.

7. Personalizar la transformación de datos

El paquete spatie/laravel-data permite personalizar la transformación, por ejemplo, cambiar el nombre de los atributos o agregar campos calculados.

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})";
    }
}

Ahora, puedes usar fullContact() para obtener una cadena con formato personalizado cuando trabajes con este DTO.

8. Validación de datos y DTO

Puedes agregar reglas de validación directamente en el DTO usando la función Reglas de 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
    ) {}
}

Explicación:

  • Con atributos de validación como #[Obligatorio] y #[Correo electrónico], puedes aplicar la validación directamente en el nivel DTO, agilizando aún más el proceso.

Conclusión

En este tutorial práctico, exploramos cómo crear y usar objetos de transferencia de datos (DTO) usando Laravel Data. Con el patrón DTO, puede administrar y transformar sus datos de manera limpia, asegurando la separación de preocupaciones entre las capas de su aplicación, mientras hace que el código sea más fácil de mantener. El paquete spatie/laravel-data simplifica la gestión de DTO y ofrece funciones fáciles de usar tanto para desarrolladores como para aplicaciones a gran escala.

Declaración de liberación Este artículo se reproduce en: https://dev.to/mdarifulhaque/simplifying-data-transfer-in-laravel-with-dtos-1il7?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3