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
9 November 2025
Perbedaan Laravel Volt dan Laravel Breeze: Kapan Pakai Yang Mana?
Saat mulai proyek Laravel baru, salah satu pertanyaan yang sering muncul adalah: pakai Breeze atau Volt? Keduanya dari ekosistem Laravel, tapi perannya sangat berbeda. Artikel ini menjelaskan perbedaan Laravel Volt dan Laravel Breeze, bukan untuk memilih yang “lebih baik”, tapi untuk memahami kapan masing-masing dipakai. Laravel Breeze: Starter Kit Autentikasi Laravel Breeze adalah starter kit […]
Baca Artikel10 November 2025
Cara Membuat Custom Artisan Command di Laravel 12
Artisan bawaan Laravel sudah mencakup banyak kebutuhan. Tapi kadang Anda butuh command yang spesifik untuk proyek Anda, misalnya generate laporan harian, kirim email batch, atau sync data dari API eksternal. Di sinilah custom Artisan command berguna. Artikel ini menunjukkan cara membuat, mengatur parameter, dan menjalankan scheduled command di Laravel 12. Membuat Custom Command Gunakan Artisan […]
Baca Artikel10 November 2025
Apa Itu Event dan Listener di Laravel 12: Arsitektur Event-Driven
Salah satu ciri arsitektur Laravel yang baik: ketika sesuatu terjadi di aplikasi, komponen lain bisa “mendengarkan” dan merespons, tanpa si pengirim perlu tahu siapa yang merespons. Itulah fungsi Event dan Listener di Laravel. Artikel ini menjelaskan cara kerjanya dan bagaimana implementasinya dengan contoh nyata. Konsep Event dan Listener Event adalah kejadian yang terjadi di aplikasi: […]
Baca ArtikelIngin Membaca Artikel Lainnya?
Temukan lebih banyak insight dan tips tentang teknologi dan bisnis digital.
Lihat Semua Artikel