Eloquent API Resources

Laravel
Tempo de leitura: 4 minutos

Eloquent API Resources: No desenvolvimento de APIs RESTful, a forma como os dados do banco de dados são apresentados aos clientes é crucial. O Laravel Eloquent API Resources fornece uma camada de transformação que atua entre seus Models Eloquent e a resposta JSON. Isso permite um controle granular, garantindo que a API retorne dados formatados e estruturados de maneira limpa e consistente.

Este artigo detalha a criação e o uso de Resources e Resource Collections para construir APIs robustas.

1. 📝 Gerando e Escrevendo Resources

Um Resource é uma classe que define o mapeamento dos atributos do Model para a estrutura JSON de saída.

A. Geração de Resources

Use o Artisan para criar um Resource Individual (para um único Model) e uma Resource Collection (para listar múltiplos Models).

Bash

# Resource Individual (para User::find(1))
php artisan make:resource UserResource

# Resource Collection (para User::all() ou User::paginate())
php artisan make:resource UserCollection --collection 

B. O Método toArray

Em um Resource Individual (UserResource), o objeto $this dentro do método toArray() representa a instância do Model sendo transformada.

PHP

// app/Http/Resources/UserResource.php

use Illuminate\Http\Resources\Json\JsonResource;

class UserResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            // Mapeamento Direto
            'id_usuario' => $this->id,
            'nome' => $this->name,
            
            // Formatação/Transformação
            'data_registro' => $this->created_at->format('Y-m-d H:i:s'),

            // Atributo Condicional (só inclui se $this->is_admin for verdadeiro)
            'token_admin' => $this->when($this->is_admin, 'admin-token-123'),
        ];
    }
}

2. 🔗 Relacionamentos e Collections

A. Transformando Relacionamentos

Você deve usar Resources para transformar relacionamentos. Isso garante que os dados aninhados também sigam o formato da API.

Tipo de RelacionamentoMétodo no ResourceExemplo
Um para Um (Profile)Instanciar o Resource'profile' => new ProfileResource($this->profile),
Um para Muitos (Posts)Usar Resource::collection()'posts' => PostResource::collection($this->posts),

PHP

// Incluindo Posts (Has Many) dentro do UserResource
class UserResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            // ... atributos de User ...
            'posts' => PostResource::collection($this->whenLoaded('posts')), // Só carrega se Eager Loaded
        ];
    }
}

Dica: Use whenLoaded('relacionamento') para garantir que o relacionamento só seja incluído se tiver sido carregado via Eager Loading (User::with('posts')). Isso evita consultas desnecessárias e ajuda a prevenir o problema N+1.

B. Resource Collections

Para listar vários usuários (com paginação, por exemplo), use o Resource Collection (UserCollection). Ele recebe a Collection/Paginator no construtor.

PHP

// app/Http/Resources/UserCollection.php
use Illuminate\Http\Resources\Json\ResourceCollection;

class UserCollection extends ResourceCollection
{
    public function toArray($request)
    {
        // Chama o UserResource para transformar cada item da coleção ($this->collection)
        return $this->collection->map(function ($user) {
            return new UserResource($user);
        })->all(); 
    }
    
    // Você pode adicionar metadados aqui (ex: cabeçalhos para o total)
    public function with($request)
    {
        return [
            'status' => 'success',
        ];
    }
}

3. 🚦 Atributos e Metadados Condicionais

A. Inclusão Condicional (when)

O método when(boolean $condition, mixed $value, mixed $default = UNSET) inclui o atributo apenas se a condição for verdadeira.

PHP

// Inclui o 'salario' somente se o usuário autenticado for um manager
'salario' => $this->when($request->user()->can('view-salary'), $this->salary),

// Inclui a 'bio' se estiver carregada, ou null
'bio' => $this->whenLoaded('profile.bio', null),

B. Adicionando Metadados

Você pode adicionar metadados à resposta (além do envelope data) no seu Controller ou no Resource Collection.

PHP

use App\Http\Resources\UserResource;
use App\Models\User;

public function index()
{
    // Adiciona o total de usuários na resposta JSON
    return UserResource::collection(User::paginate(10))
        ->additional([
            'metadados' => [
                'total_geral' => User::count(),
                'version' => '1.0.0',
            ],
        ]);
}

4. 🚀 Retornando Resources no Controller

Basta retornar a instância do Resource ou Resource Collection do seu método do Controller. O Laravel fará a serialização JSON automaticamente.

PHP

use App\Http\Resources\UserResource;
use App\Models\User;

public function show(User $user)
{
    // Retorna um único Resource
    return new UserResource($user);
}

public function index()
{
    $users = User::with('posts')->paginate(10);
    
    // Retorna uma Collection de Resources
    return UserResource::collection($users);
}

Nota sobre Paginação: Quando você retorna uma coleção de resources a partir de um paginador (ex: User::paginate()), o Laravel automaticamente inclui os metadados de paginação (links, meta, current_page, etc.) na resposta JSON, seguindo as especificações JSON:API.

✅ Conclusão Eloquent API Resources

Eloquent API Resources: Os API Resources são cruciais para a separação de responsabilidades (dados do BD vs. apresentação da API). Eles fornecem um controle inigualável sobre a serialização JSON, permitindo que você formate dados, inclua relacionamentos de forma inteligente (via whenLoaded) e adicione atributos condicionais. O domínio dos Resources é essencial para construir APIs consistentes, seguras e altamente manuteníveis em Laravel.

Mas antes de dominar o Laravel, se for o seu caso, toda jornada tem um início. Vamos entender quais são os conhecimentos básicos necessários para aproveitar ao máximo este poderoso framework. Para iniciar seus estudos no Laravel, você precisará dominar as seguintes tecnologias:

HTML
HTML
CSS
CSS
Javascript
JavaScript
SQL
SQL
Capa Curso PHP
PHP

E se você gosta do nosso conteúdo, não deixe de contribuir adquirindo os serviços e produtos dos nossos apoiadores e empresas que somos associados:

Hospedagem Hostinger
Ofertas Amazon
Amazon Prime

Author: Thiago Rossi
Com mais de 20 anos de jornada na tecnologia, minha trajetória evoluiu do ensino técnico à arquitetura de sistemas complexos. Hoje, foco minha expertise no desenvolvimento de soluções de Inteligência Artificial nativa e análise de dados públicos, utilizando o ecossistema PHP para transformar dados brutos em transparência e eficiência. Como autor e desenvolvedor, acredito na democratização do conhecimento. Essa visão resultou em uma biblioteca de mais de 530 artigos gratuitos, cobrindo desde a base do WebDev e Infraestrutura até os bastidores da indústria de Jogos e IA. No universo de Game Design, sou autor do livro "GDD – O Guia Definitivo" e documento ativamente meus processos através de DevLogs, unindo rigor técnico e criatividade em projetos desenvolvidos com GDevelop 5. Meu compromisso é conectar engenharia de ponta com as reais oportunidades do mercado de tecnologia.