REST API with Laravel
LaravelLaravel makes building REST APIs easy. In this lesson you'll build a complete CRUD API with proper responses, validation, and authentication.
API Routes
routes/api.php
<?php
use App\Http\Controllers\Api\PostController;
// All API routes are prefixed with /api automatically
Route::apiResource('posts', PostController::class);
// Generates:
// GET /api/posts
// POST /api/posts
// GET /api/posts/{post}
// PUT /api/posts/{post}
// DELETE /api/posts/{post}
// Protected routes
Route::middleware('auth:sanctum')->group(function () {
Route::apiResource('posts', PostController::class);
Route::post('/logout', [AuthController::class, 'logout']);
});
?>API Controller
PHP
<?php
namespace App\Http\Controllers\Api;
use App\Models\Post;
use Illuminate\Http\Request;
use App\Http\Resources\PostResource;
class PostController extends Controller
{
public function index()
{
$posts = Post::with('user')->paginate(15);
return PostResource::collection($posts);
}
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|string|max:255',
'body' => 'required|string',
]);
$post = Post::create([
...$validated,
'user_id' => auth()->id(),
]);
return new PostResource($post);
}
public function show(Post $post)
{
return new PostResource($post->load('user'));
}
public function update(Request $request, Post $post)
{
$validated = $request->validate([
'title' => 'sometimes|string|max:255',
'body' => 'sometimes|string',
]);
$post->update($validated);
return new PostResource($post);
}
public function destroy(Post $post)
{
$post->delete();
return response()->json(['message' => 'Deleted successfully']);
}
}
?>API Resources
PHP
<?php
// php artisan make:resource PostResource
class PostResource extends JsonResource
{
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'body' => $this->body,
'published' => $this->published,
'created_at' => $this->created_at->toISOString(),
'author' => [
'id' => $this->user->id,
'name' => $this->user->name,
],
];
}
}
// Response format:
// {
// "data": {
// "id": 1,
// "title": "My Post",
// "author": { "id": 1, "name": "John" }
// }
// }
?>JSON Responses
PHP
<?php
// Success responses
return response()->json(['data' => $post], 200);
return response()->json(['message' => 'Created'], 201);
return response()->json(null, 204); // No content
// Error responses
return response()->json(['error' => 'Not found'], 404);
return response()->json(['error' => 'Unauthorized'], 401);
return response()->json(['error' => 'Forbidden'], 403);
return response()->json(['errors' => $errors], 422); // Validation
?>💡
Congratulations! 🎉 You've completed the Laravel track! You now know routing, controllers, Blade, migrations, Eloquent, middleware, auth, and APIs. You're a Laravel developer! Keep building projects to solidify your skills.
Test your knowledge!
Take a quiz to reinforce what you learned.