Controller

Memindahkan logika dari route ke controller, resource controller, injeksi dependensi, dan atribut #[Middleware] Laravel 13.

Part 5 dari 26 ± 40 menit Gratis

Controller: tempat logika request

Menaruh semua logika di closure route cepat berantakan. Controller adalah class yang mengelompokkan penanganan request terkait. Buat dengan Artisan:

php artisan make:controller ProdukController
php artisan make:controller ProdukController --resource --model=Produk   # lengkap dengan 7 method CRUD
php artisan make:controller UnduhLaporan --invokable                     # controller satu aksi

Contoh controller

<?php

namespace App\Http\Controllers;

use App\Models\Produk;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;

class ProdukController extends Controller
{
    public function index(): View
    {
        return view('produk.index', [
            'produk' => Produk::latest()->paginate(10),
        ]);
    }

    public function show(Produk $produk): View            // route model binding
    {
        return view('produk.show', compact('produk'));
    }

    public function store(Request $request): RedirectResponse
    {
        $data = $request->validate([
            'nama'  => 'required|string|max:100',
            'harga' => 'required|integer|min:0',
        ]);

        Produk::create($data);

        return redirect()->route('produk.index')->with('status', 'Produk disimpan');
    }
}

Sambungkan di route: Route::resource('produk', ProdukController::class); atau satu per satu [ProdukController::class, 'index'].

Injeksi dependensi

Laravel membaca type-hint pada parameter method dan otomatis menyuntikkan objeknya lewat service container: Request, model (binding), layanan buatanmu, dst. Boleh digabung dengan parameter route:

public function update(Request $request, Produk $produk, HitungPajak $pajak): RedirectResponse
{
    // $request, $produk (dari {produk}), dan $pajak disuntikkan otomatis
}

Middleware di controller — cara Laravel 13

Laravel 13 memperluas dukungan atribut PHP. Middleware dan otorisasi kini bisa dideklarasikan langsung di class atau method:

use Illuminate\Routing\Attributes\Controllers\Authorize;
use Illuminate\Routing\Attributes\Controllers\Middleware;

#[Middleware('auth')]                       // berlaku untuk seluruh method
class KomentarController extends Controller
{
    #[Middleware('subscribed')]             // tambahan hanya untuk store()
    #[Authorize('create', [Komentar::class, 'post'])]
    public function store(Post $post)
    {
        // ...
    }
}

Cara lama (masih berlaku): implementasikan HasMiddleware dengan method statis middleware(), atau pasang middleware di route. Atribut membuat konfigurasi dekat dengan kodenya dan mudah dibaca.

Controller yang baik

  • Tipis: terima request → validasi → panggil model/service → kembalikan response. Logika bisnis yang rumit pindahkan ke class service/action.
  • Gunakan return type (View, RedirectResponse, JsonResponse).
  • Satu controller per sumber daya (resource). Terlalu banyak method di luar CRUD standar = tanda perlu controller baru.
  • Jangan memakai $_GET/$_POST langsung; pakai objek Request.

Controller satu aksi (invokable)

class UnduhLaporan extends Controller
{
    public function __invoke(Request $request) { /* ... */ }
}
Route::get('/laporan', UnduhLaporan::class);

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X