Lessons → Laravel → Lesson 10

REST API with Laravel

Laravel
⏱ 30 min read📖 IntermediateNot completed

Laravel 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.
← Previous Lesson All Lessons →
🧠

Test your knowledge!

Take a quiz to reinforce what you learned.

Take Quiz →