<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
mustafafares / laravel-selective-response example snippets
namespace App\Http\Resources;
use MustafaFares\SelectiveResponse\Http\Resources\BaseApiResource;
class UserResource extends BaseApiResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'phone' => $this->phone,
'address' => $this->address,
];
}
}
namespace App\Http\Controllers\Api;
use App\Http\Resources\UserResource;
use App\Models\User;
class UserController extends Controller
{
// Full response - returns all fields
public function show($id)
{
$user = User::findOrFail($id);
return new UserResource($user);
}
// Selective response - returns only selected fields
public function summary($id)
{
$user = User::select('id', 'name', 'email')->findOrFail($id);
return new UserResource($user);
// Returns: {id, name, email} ✨
}
}
// Resource (no changes needed!)
class UserResource extends BaseApiResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'phone' => $this->phone,
];
}
}
// Controller - Full response
$user = User::find($id);
return new UserResource($user);
// Returns: {id, name, email, phone}
// Controller - Selective response
$user = User::select('id', 'name')->find($id);
return new UserResource($user);
// Returns: {id, name} ✨ Automatic!
class UserResource extends BaseApiResource
{
protected $alwaysInclude = ['id'];
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
];
}
}
// Even with select('name'), 'id' is always
// Option 1: In resource class
class AdminResource extends BaseApiResource
{
protected $useSelectiveResponse = false;
}
// Option 2: In controller
return (new UserResource($user))->withoutSelectiveFiltering();
public function summary($id)
{
$user = User::select('name')->findOrFail($id);
return (new UserResource($user))
->alwaysInclude(['id', 'created_at']);
}