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.

Leave a Reply