Controller
Memindahkan logika dari route ke controller, resource controller, injeksi dependensi, dan atribut #[Middleware] Laravel 13.
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/$_POSTlangsung; pakai objekRequest.
Controller satu aksi (invokable)
class UnduhLaporan extends Controller
{
public function __invoke(Request $request) { /* ... */ }
}
Route::get('/laporan', UnduhLaporan::class);