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
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 Artikel10 November 2025
Concurrency Adalah? Cara Kerja Concurrency di Laravel 12
Concurrency adalah teknik menjalankan proses secara bersamaan. Pelajari cara kerja Laravel Concurrency, contoh penggunaan, perbedaan dengan queue, dan kapan memakainya.
Baca Artikel9 November 2025
Notification di Laravel 12: Email, Database, dan Channel Kustom
Hampir semua aplikasi web butuh notifikasi: konfirmasi order, reset password, atau pemberitahuan saat ada komentar baru. Laravel punya sistem notifikasi yang cukup fleksibel: satu kelas bisa kirim ke email, database, Slack, dan channel lain sekaligus. Artikel ini membahas cara kerja notification di Laravel 12, mulai dari membuat kelas notifikasi, kirim via email dan database, sampai […]
Baca ArtikelIngin Membaca Artikel Lainnya?
Temukan lebih banyak insight dan tips tentang teknologi dan bisnis digital.
Lihat Semua Artikel