Bird
Raised Fist0
Laravelframework~20 mins

API resource classes in Laravel - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
API Resource Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
What is the output of this Laravel API Resource?
Given the following Laravel API Resource class, what will be the JSON output when returning new UserResource($user) where $user has id=5, name='Alice', and email='alice@example.com'?
Laravel
<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class UserResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'user_id' => $this->id,
            'user_name' => $this->name,
            'contact' => $this->email,
        ];
    }
}
A{"userId":5,"userName":"Alice","emailAddress":"alice@example.com"}
B{"user_id":5,"user_name":"Alice","contact":"alice@example.com"}
C[5,"Alice","alice@example.com"]
D{"id":5,"name":"Alice","email":"alice@example.com"}
Attempts:
2 left
💡 Hint
Look at the keys returned in the toArray method and match them with the output.
❓ lifecycle
intermediate
1:30remaining
When is the toArray method called in a Laravel API Resource?
In Laravel API Resource classes, at what point is the toArray method executed?
AImmediately when the resource object is created with <code>new</code>.
BOnly when explicitly calling <code>toArray()</code> in the controller.
CWhen the resource is converted to JSON, such as when returned from a controller.
DWhen the resource is saved to the database.
Attempts:
2 left
💡 Hint
Think about when Laravel sends data to the browser or API client.
📝 Syntax
advanced
2:30remaining
Which option correctly adds a conditional attribute in a Laravel API Resource?
You want to include the admin_notes attribute only if the user is an admin. Which code snippet inside toArray is correct?
A
return [
  'id' =&gt; $this-&gt;id,
  'name' =&gt; $this-&gt;name,
  'admin_notes' =&gt; $this-&gt;when($this-&gt;is_admin, $this-&gt;admin_notes),
];
B
return [
  'id' =&gt; $this-&gt;id,
  'name' =&gt; $this-&gt;name,
  'admin_notes' =&gt; $this-&gt;admin_notes if ($this-&gt;is_admin),
];
C
return [
  'id' =&gt; $this-&gt;id,
  'name' =&gt; $this-&gt;name,
  'admin_notes' =&gt; $this-&gt;is_admin ? $this-&gt;admin_notes : null,
];
D
return [
  'id' =&gt; $this-&gt;id,
  'name' =&gt; $this-&gt;name,
  'admin_notes' =&gt; $this-&gt;when($this-&gt;admin_notes, $this-&gt;is_admin),
];
Attempts:
2 left
💡 Hint
Use Laravel's when helper method correctly.
🔧 Debug
advanced
2:30remaining
Why does this Laravel API Resource return an empty JSON object?
Given this resource class, why does the API return {} instead of user data?
Laravel
<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class UserResource extends JsonResource
{
    public function toArray($request)
    {
        // Missing return statement
        [
            'id' => $this->id,
            'name' => $this->name,
        ];
    }
}
AThe resource class must extend <code>ResourceCollection</code> instead of <code>JsonResource</code>.
BThe resource class is missing the <code>JsonSerializable</code> interface implementation.
CThe <code>$this->id</code> and <code>$this->name</code> properties are not accessible.
DThe <code>toArray</code> method does not return the array; it just creates it without returning.
Attempts:
2 left
💡 Hint
Check if the toArray method returns the data.
🧠 Conceptual
expert
2:00remaining
What is the main benefit of using Laravel API Resource classes?
Why should you use Laravel API Resource classes instead of returning Eloquent models directly in API responses?
AThey allow you to control and customize the JSON structure and hide sensitive data easily.
BThey automatically cache all API responses for better performance.
CThey convert Eloquent models into XML format for API clients.
DThey replace the need for database migrations and schema definitions.
Attempts:
2 left
💡 Hint
Think about data control and security in API responses.

Practice

(1/5)
1. What is the main purpose of an API Resource Class in Laravel?
easy
A. To manage user authentication
B. To handle database migrations
C. To format and control the data sent in API responses
D. To create views for web pages

Solution

  1. 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.
  2. Step 2: Identify what they do not do

    They do not handle database migrations, authentication, or view rendering.
  3. Final Answer:

    To format and control the data sent in API responses -> Option C
  4. Quick 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
A. return new UserResource($user);
B. return UserResource::collection($user);
C. return UserResource::makeCollection($user);
D. return UserResource::toJson($user);

Solution

  1. 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).
  2. Step 2: Understand collection syntax

    UserResource::collection($user) is for multiple models, not a single one.
  3. Final Answer:

    return new UserResource($user); -> Option A
  4. Quick 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
A. {"id":5,"name":"Alice"}
B. {"user_id":5,"user_name":"Alice"}
C. {"userId":5,"userName":"Alice"}
D. {"user_id":5,"name":"Alice"}

Solution

  1. 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.
  2. Step 2: Match output keys and values

    Given id=5 and name='Alice', the JSON keys and values must match exactly as defined.
  3. Final Answer:

    {"user_id":5,"user_name":"Alice"} -> Option B
  4. Quick 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
A. The code is correct and will return a collection of formatted products
B. Using ProductResource::collection is incorrect for multiple products
C. The controller should instantiate ProductResource with new keyword for collections
D. The toArray method should return a JSON string, not an array

Solution

  1. Step 1: Check toArray method return type

    toArray should return an array, which Laravel converts to JSON automatically.
  2. Step 2: Verify collection usage

    Using ProductResource::collection($products) is the correct way to return multiple resources.
  3. Final Answer:

    The code is correct and will return a collection of formatted products -> Option A
  4. Quick 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
A. Add 'is_admin' => $this->isAdmin() ? true : false, unconditionally
B. Return two different resource classes for admin and non-admin users
C. Add 'is_admin' only if $this->isAdmin() is true by overriding toResponse()
D. Use 'when' helper: 'is_admin' => $this->when($this->isAdmin(), true)

Solution

  1. Step 1: Understand conditional fields in API Resources

    Laravel provides the 'when' helper to conditionally include fields in the response.
  2. 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.
  3. Final Answer:

    Use 'when' helper: 'is_admin' => $this->when($this->isAdmin(), true) -> Option D
  4. Quick 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