laravelapirestMenengah3 mnt baca

Membangun REST Controller

Bangun API REST yang proper: apiResource, status code yang benar, dan respons error konsisten.

Route API di Laravel 11

Route API didefinisikan di routes/api.php dan otomatis mendapat prefix /api tanpa session state. Di Laravel 11 file ini tidak dibuat default oleh installer, generate dengan:

bash
php artisan install:api

Perintah ini memasang Sanctum dan membuat routes/api.php.

apiResource: CRUD API sekali jalan

php
// routes/api.php
use App\Http\Controllers\Api\PostController;

Route::apiResource('posts', PostController::class);

Bedanya dengan Route::resource biasa: versi API tidak membuat route create dan edit (yang mengembalikan form HTML). Hasilnya lima endpoint: index, store, show, update, destroy.

Controller dengan status code yang benar

php
// app/Http/Controllers/Api/PostController.php
namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Resources\PostResource;
use App\Models\Post;

class PostController extends Controller
{
    public function index()
    {
        return PostResource::collection(Post::with('user')->paginate(15));
    }

    public function store(StorePostRequest $request)
    {
        $post = Post::create($request->validated());
        return (new PostResource($post))
            ->response()
            ->setStatusCode(201);
    }

    public function show(Post $post)
    {
        return new PostResource($post->load('user'));
    }

    public function update(StorePostRequest $request, Post $post)
    {
        $post->update($request->validated());
        return new PostResource($post);
    }

    public function destroy(Post $post)
    {
        $post->delete();
        return response()->noContent(); // 204
    }
}

Status code yang umum: 200 OK, 201 Created, 204 No Content (delete sukses), 422 validasi gagal (otomatis dari Form Request), 404 tidak ketemu, 403 tidak punya akses.

Respons error yang konsisten

Untuk API, error validasi Laravel otomatis berbentuk JSON dengan status 422 kalau request memakai header Accept: application/json. Untuk error kustom, buat format sendiri yang konsisten:

php
return response()->json([
    'message' => 'Post tidak ditemukan.',
    'errors' => ['id' => ['ID tidak valid.']],
], 404);

Catatan teknis: Selalu proteksi route API tulis dengan autentikasi (Sanctum token) dan policy. Endpoint POST /api/posts yang terbuka untuk publik sama saja mengundang spam. Minimal pasang auth:sanctum untuk store, update, dan destroy.