"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Simplificando a transferência de dados no Laravel com DTOs

Simplificando a transferência de dados no Laravel com DTOs

Publicado em 2024-11-07
Navegar:481

Simplifying Data Transfer in Laravel with DTOs

Aqui está um exemplo passo a passo sobre como criar objetos de transferência de dados (DTOs) usando Laravel Data:

1. Instale o pacote de dados Laravel

Para começar, instale o pacote spatie/laravel-data usando o Composer. Este pacote ajuda na criação de DTOs e no gerenciamento eficiente de dados.

composer require spatie/laravel-data

2. Crie um objeto de transferência de dados (DTO)

Depois de instalar o pacote, podemos criar uma classe DTO para lidar com a transferência de dados. Suponha que temos uma entidade User e queremos criar um DTO para transferir dados do usuário.

Execute o seguinte comando Artisan para gerar uma nova classe DTO:

php artisan make:data UserData

Isso criará uma classe UserData dentro do diretório App/Data.

3. Definir propriedades e tipos em DTO

Agora, vamos editar a classe UserData para definir as propriedades e os tipos de dados que você espera para seu 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
    ) {}
}

Explicação:

  • O método __construct atribui automaticamente os valores recebidos às propriedades DTO.
  • O ?string $phone = null indica que a propriedade phone é opcional.

4. Use DTO em um controlador

Agora que o UserData DTO foi criado, podemos usá-lo dentro de nosso controlador para lidar com os dados recebidos, transformá-los e passá-los entre as camadas do aplicativo.

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

Explicação:

  • O método UserData::from() mapeia automaticamente os dados da solicitação validada para o objeto DTO.
  • O objeto DTO agora pode ser usado para transferir dados entre o controlador e o modelo (ou outras camadas da aplicação).

5. Transformar dados usando DTO

Você também pode usar o DTO para transformar dados ao retornar respostas. Vamos modificar o método show no UserController para retornar os dados do usuário através do 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);
}

Explicação:

  • Aqui, criamos manualmente um DTO UserData, passando as propriedades do modelo User para o construtor DTO.
  • Este DTO pode ser retornado diretamente como uma resposta JSON, garantindo um formato de dados estruturado.

6. DTO com coleções

Se você estiver trabalhando com coleções de dados, como buscar uma lista de usuários, o pacote DTO também fornece um método simples para lidar com coleções.

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

Explicação:

  • O método UserData::collection($users) mapeia cada modelo User para o DTO UserData, transformando a coleção inteira em uma lista de DTOs.

7. Personalizar a transformação de dados

O pacote spatie/laravel-data permite customização da transformação, por exemplo, renomeando atributos ou adicionando campos computados.

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

Agora, você pode usar fullContact() para obter uma string formatada personalizada ao trabalhar com este DTO.

8. Validação de dados e DTOs

Você pode adicionar regras de validação diretamente no DTO usando o recurso Regras do 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
    ) {}
}

Explicação:

  • Com atributos de validação como #[Required] e #[Email], você pode impor a validação diretamente no nível DTO, agilizando ainda mais o processo.

Conclusão

Neste tutorial prático, exploramos como criar e usar objetos de transferência de dados (DTOs) usando Laravel Data. Com o padrão DTO, você pode gerenciar e transformar seus dados de maneira limpa, garantindo a separação de preocupações entre as camadas do seu aplicativo e, ao mesmo tempo, facilitando a manutenção do código. O pacote spatie/laravel-data simplifica o gerenciamento de DTO, oferecendo recursos fáceis de usar para desenvolvedores e aplicativos de grande escala.

Declaração de lançamento Este artigo está reproduzido em: https://dev.to/mdarifulhaque/simplifying-data-transfer-in-laravel-with-dtos-1il7?1 Se houver alguma infração, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3