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.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *