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:
php artisan install:apiPerintah ini memasang Sanctum dan membuat routes/api.php.
apiResource: CRUD API sekali jalan
// 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
// 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:
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/postsyang terbuka untuk publik sama saja mengundang spam. Minimal pasangauth:sanctumuntuk store, update, dan destroy.