API resource classes help you turn your data into a clean, easy-to-read format for apps to use. They make your API responses consistent and simple.
API resource classes in Laravel
Start learning this pattern below
Jump into concepts and practice - no test required
or
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
Syntax
Laravel
php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; class YourResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, // add other fields here ]; } }
The toArray method defines how your data is shaped in the API response.
You extend JsonResource to create a resource class for your model.
Examples
Laravel
php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; class UserResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'email' => $this->email, 'created_at' => $this->created_at->toDateString(), ]; } }
Laravel
php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; class PostResource extends JsonResource { public function toArray($request) { return [ 'title' => $this->title, 'content' => $this->content, 'author' => new UserResource($this->whenLoaded('author')), ]; } }
Sample Program
This resource class formats a product's data. It shows the price with a dollar sign and checks if the product is in stock.
Laravel
<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; class ProductResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, 'price' => "$" . number_format($this->price, 2), 'in_stock' => $this->stock > 0, ]; } } // Usage in a controller method: // return new ProductResource(Product::find(1));
Important Notes
You can add conditional fields using $this->when() to show data only sometimes.
Use resource collections to return lists of resources easily.
Remember to load related data with with() in your queries to avoid extra database calls.
Summary
API resource classes format your data for clean API responses.
They help control what data your API sends out.
Use them to keep your API consistent and easy to maintain.
Practice
1. What is the main purpose of an
API Resource Class in Laravel?easy
Solution
Step 1: Understand the role of API Resource Classes
API Resource Classes in Laravel are designed to transform data models into JSON responses for APIs.Step 2: Identify what they do not do
They do not handle database migrations, authentication, or view rendering.Final Answer:
To format and control the data sent in API responses -> Option CQuick Check:
API Resource Classes = Format API data [OK]
Hint: Remember: API Resource Classes shape API output data [OK]
Common Mistakes:
- Confusing resource classes with controllers
- Thinking resource classes handle database or auth
- Assuming resource classes create HTML views
2. Which of the following is the correct way to return a single resource in a Laravel controller using an API Resource Class named
UserResource?easy
Solution
Step 1: Recall syntax for returning a single resource
To return a single model as a resource, you instantiate the resource class with the model:new UserResource($user).Step 2: Understand collection syntax
UserResource::collection($user)is for multiple models, not a single one.Final Answer:
return new UserResource($user); -> Option AQuick Check:
Single resource = new Resource($model) [OK]
Hint: Use 'new Resource($model)' for single items [OK]
Common Mistakes:
- Using collection() for single model
- Calling non-existent methods like makeCollection()
- Trying toJson() on resource class directly
3. Given the following Laravel API Resource class code, what will be the JSON output for a user with
id=5 and name='Alice'?
class UserResource extends JsonResource {
public function toArray($request) {
return [
'user_id' => $this->id,
'user_name' => $this->name
];
}
}
// In controller:
return new UserResource($user);medium
Solution
Step 1: Analyze the toArray method
The method returns an array with keys 'user_id' and 'user_name' mapped to the model's id and name.Step 2: Match output keys and values
Given id=5 and name='Alice', the JSON keys and values must match exactly as defined.Final Answer:
{"user_id":5,"user_name":"Alice"} -> Option BQuick Check:
toArray keys = JSON keys [OK]
Hint: Match keys exactly as returned in toArray() [OK]
Common Mistakes:
- Assuming default keys like 'id' instead of 'user_id'
- Mixing camelCase and snake_case keys
- Ignoring the resource's toArray method
4. What is wrong with this Laravel API Resource class code snippet?
class ProductResource extends JsonResource {
public function toArray($request) {
return [
'id' => $this->id,
'name' => $this->name,
'price' => $this->price
];
}
}
// In controller:
return ProductResource::collection($products);medium
Solution
Step 1: Check toArray method return type
toArray should return an array, which Laravel converts to JSON automatically.Step 2: Verify collection usage
Using ProductResource::collection($products) is the correct way to return multiple resources.Final Answer:
The code is correct and will return a collection of formatted products -> Option AQuick Check:
collection() for multiple models = correct [OK]
Hint: Use ::collection() for multiple models, toArray returns array [OK]
Common Mistakes:
- Expecting toArray to return JSON string
- Using new keyword for collections
- Confusing single resource and collection syntax
5. You want to add a conditional field
is_admin to your UserResource that only appears if the user has admin rights. Which is the best way to do this in the toArray method?hard
Solution
Step 1: Understand conditional fields in API Resources
Laravel provides the 'when' helper to conditionally include fields in the response.Step 2: Evaluate options
Use 'when' helper: 'is_admin' => $this->when($this->isAdmin(), true) uses 'when' correctly to include 'is_admin' only if the user is admin.Final Answer:
Use 'when' helper: 'is_admin' => $this->when($this->isAdmin(), true) -> Option DQuick Check:
Use when() for conditional fields [OK]
Hint: Use when() helper to add fields conditionally [OK]
Common Mistakes:
- Always including the field even if false
- Overriding toResponse unnecessarily
- Creating separate resource classes for small condition
