Membuat Controller di Laravel 12: Resource, API, dan Best Practice
Controller adalah salah satu komponen paling sering ditulis di Laravel. Hampir setiap fitur butuh controller: dari menampilkan halaman, menyimpan data form, sampai mengembalikan JSON untuk API.
Artikel ini membahas cara membuat controller di Laravel 12: dari controller dasar, resource controller, sampai best practice yang dipakai tim profesional.
Membuat Controller Baru
Gunakan perintah Artisan:
php artisan make:controller ArticleController
File akan dibuat di app/Http/Controllers/ArticleController.php:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
class ArticleController extends Controller
{
//
}
Tambahkan method sesuai kebutuhan. Misalnya untuk menampilkan daftar artikel:
public function index()
{
$articles = Article::latest()->paginate(10);
return view('articles.index', compact('articles'));
}
public function show(Article $article)
{
return view('articles.show', compact('article'));
}
Resource Controller
Kalau Anda butuh semua operasi CRUD sekaligus, pakai flag --resource:
php artisan make:controller ArticleController --resource
Laravel akan generate 7 method sekaligus: index, create, store, show, edit, update, destroy.
Daftarkan ke route dengan satu baris:
Route::resource('articles', ArticleController::class);
Ini otomatis membuat route untuk semua aksi CRUD, tidak perlu daftar satu per satu.
API Resource Controller
Untuk API yang tidak butuh halaman form (create/edit), pakai flag --api:
php artisan make:controller Api/ArticleController --api
Hasilnya hanya 5 method: index, store, show, update, destroy. Tanpa create dan edit.
Route::apiResource('articles', ApiArticleController::class);
Dependency Injection di Controller
Laravel mendukung dependency injection lewat constructor. Ini cara yang direkomendasikan untuk inject service:
<?php
namespace AppHttpControllers;
use AppServicesArticleService;
use IlluminateHttpRequest;
class ArticleController extends Controller
{
public function __construct(
private ArticleService $articleService
) {}
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|string|max:255',
'content' => 'required|string',
'status' => 'required|in:draft,published',
]);
$article = $this->articleService->create($validated);
return redirect()->route('articles.show', $article)
->with('success', 'Artikel berhasil dibuat.');
}
}
Middleware di Controller
Di Laravel 12, cara attach middleware ke controller berubah. Tidak lagi lewat constructor, tapi lewat method middleware() di route atau lewat static method di controller:
// Di routes/web.php
Route::resource('articles', ArticleController::class)
->middleware('auth');
// Atau partial — hanya method tertentu
Route::resource('articles', ArticleController::class)
->only(['store', 'update', 'destroy'])
->middleware('auth');
Kalau ingin lebih granular per-method, pakai route biasa:
Route::get('/articles', [ArticleController::class, 'index']);
Route::post('/articles', [ArticleController::class, 'store'])->middleware('auth');
Route::get('/articles/{article}', [ArticleController::class, 'show']);
Form Request untuk Validasi
Untuk controller yang lebih bersih, pindahkan validasi ke Form Request:
php artisan make:request StoreArticleRequest
<?php
namespace AppHttpRequests;
use IlluminateFoundationHttpFormRequest;
class StoreArticleRequest extends FormRequest
{
public function authorize(): bool
{
return auth()->check();
}
public function rules(): array
{
return [
'title' => 'required|string|max:255',
'content' => 'required|string|min:100',
'status' => 'required|in:draft,published',
];
}
}
Gunakan di controller:
public function store(StoreArticleRequest $request)
{
$article = Article::create($request->validated());
return redirect()->route('articles.show', $article)
->with('success', 'Artikel disimpan.');
}
Controller jadi lebih ringkas karena validasi sudah diurus Form Request.
Nested Resource Controller
Kalau ada relasi hierarkis, misalnya komentar yang dimiliki artikel, gunakan nested resource:
Route::resource('articles.comments', CommentController::class);
URL yang dihasilkan: /articles/{article}/comments/{comment}
Controller-nya otomatis menerima kedua model sebagai parameter:
public function store(Request $request, Article $article)
{
$comment = $article->comments()->create([
'body' => $request->validated('body'),
'user_id' => auth()->id(),
]);
return redirect()->route('articles.show', $article);
}
Baca Juga
- Routing di Laravel: Panduan Lengkap dengan Contoh Kode
- Invokable Controller: Kapan Dipakai dan Bagaimana Cara Kerjanya
Butuh tim untuk membangun aplikasi web berbasis Laravel dari awal? Lihat layanan pengembangan aplikasi kami.
Artikel Lainnya di Kategori Laravel
10 November 2025
Apa Itu Observer di Laravel 12 dan Kapan Menggunakannya
Kalau Event dan Listener cocok untuk “sesuatu terjadi di aplikasi, beri tahu komponen lain”, Observer punya fokus berbeda: “ketika Eloquent model berubah, jalankan kode ini.” Artikel ini menjelaskan apa itu Observer di Laravel 12, perbedaannya dengan Event Listener, dan kapan sebaiknya dipakai. Apa Itu Observer? Observer adalah kelas yang merespons event lifecycle Eloquent model: saat […]
Baca Artikel
Laravel 9 November 2025
Routing di Laravel: Panduan Lengkap dengan Contoh Kode
Routing adalah pintu masuk semua request di Laravel. Sebelum request sampai ke controller atau logika apapun, dia harus melewati router dulu. Memahami cara kerja routing akan membuat kamu lebih mudah membangun struktur aplikasi yang rapi dan mudah di-maintain. Konsep Dasar: Bagaimana Request Diproses Saat browser mengirim request ke GET /posts, Laravel membaca file routes/web.php, mencari […]
Baca Artikel10 November 2025
Contoh Implementasi Observer di Laravel 12: Auto-Slug, Audit Trail, dan Cache
Artikel ini melanjutkan penjelasan konsep Observer di Laravel 12 dengan studi kasus implementasi lengkap: sistem audit trail dan auto-slug generation. Studi Kasus 1: Auto-Slug Generation Masalah umum: setiap kali artikel dibuat atau diupdate, slug harus di-generate dari title. Tanpa Observer, logika ini tersebar di berbagai controller. Dengan Observer, cukup satu tempat: <?php namespace AppObservers; use […]
Baca ArtikelIngin Membaca Artikel Lainnya?
Temukan lebih banyak insight dan tips tentang teknologi dan bisnis digital.
Lihat Semua Artikel