Crear API Resource:
# Crear resource
php artisan make:resource UserResource
# Crear collection resource
php artisan make:resource UserCollection
// app/Http/Resources/UserResource.php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class UserResource extends JsonResource
{
public function toArray($request): array
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'created_at' => $this->created_at->toIso8601String(),
'posts_count' => $this->whenCounted('posts'),
];
}
}
API Routes:
// routes/api.php
use App\Http\Controllers\Api\UserController;
use App\Http\Resources\UserResource;
use App\Http\Resources\UserCollection;
Route::apiResource('users', UserController::class);
// O rutas manuales
Route::get('/users', [UserController::class, 'index']);
Route::post('/users', [UserController::class, 'store']);
Route::get('/users/{user}', [UserController::class, 'show']);
Route::put('/users/{user}', [UserController::class, 'update']);
Route::delete('/users/{user}', [UserController::class, 'destroy']);
API Controller:
// app/Http/Controllers/Api/UserController.php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Resources\UserResource;
use App\Http\Resources\UserCollection;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function index()
{
return new UserCollection(User::paginate(15));
}
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|min:8',
]);
$user = User::create($validated);
return new UserResource($user);
}
public function show(User $user)
{
return new UserResource($user);
}
public function update(Request $request, User $user)
{
$validated = $request->validate([
'name' => 'sometimes|required|string|max:255',
'email' => 'sometimes|required|email|unique:users,email,' . $user->id,
]);
$user->update($validated);
return new UserResource($user);
}
public function destroy(User $user)
{
$user->delete();
return response()->noContent();
}
}
Respuestas API:
// Respuesta JSON simple
return response()->json([
'message' => 'Success',
'data' => $data
]);
// Con código de estado
return response()->json(['error' => 'Not found'], 404);
// Resource
return new UserResource($user);
// Collection
return UserCollection::collection($users);
// Paginación
return UserResource::collection(User::paginate(10));
API Rate Limiting:
// En routes/api.php
Route::middleware('throttle:60,1')->group(function () {
Route::get('/users', [UserController::class, 'index']);
});
💡 Tip: Usa API Resources para transformar tus modelos. Mantienen tu lógica de presentación separada de tus modelos.