Kembali ke Artikel
9 November 2025
vandyahmad24
Diperbarui: 18 April 2026

Membuat Controller di Laravel 12: Resource, API, dan Best Practice

laravel

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

Butuh tim untuk membangun aplikasi web berbasis Laravel dari awal? Lihat layanan pengembangan aplikasi kami.

Tag: #laravel #php #tutorial
BACA JUGA

Artikel Lainnya di Kategori Laravel

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 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 Artikel
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 Artikel

Ingin Membaca Artikel Lainnya?

Temukan lebih banyak insight dan tips tentang teknologi dan bisnis digital.

Lihat Semua Artikel