Controller: Merapikan Logika Route
Pindahkan logika dari closure route ke controller, termasuk single action dan resource controller.
Kenapa butuh controller?
Closure di routes/web.php enak untuk contoh cepat, tapi kalau logikanya panjang, file route jadi berantakan. Controller adalah class khusus yang menampung logika untuk sekumpulan route terkait.
Buat controller dengan Artisan:
php artisan make:controller PostControllerFile dibuat di app/Http/Controllers/PostController.php:
// app/Http/Controllers/PostController.php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\View\View;
class PostController extends Controller
{
public function index(): View
{
$posts = Post::latest()->get();
return view('posts.index', compact('posts'));
}
public function show(Post $post): View
{
return view('posts.show', compact('post'));
}
}Lalu daftarkan di route:
// routes/web.php
use App\Http\Controllers\PostController;
Route::get('/posts', [PostController::class, 'index'])->name('posts.index');
Route::get('/posts/{post}', [PostController::class, 'show'])->name('posts.show');Single action controller
Kalau controller hanya mengerjakan satu hal, pakai method ajaib __invoke. Cocok untuk halaman statis atau aksi tunggal:
php artisan make:controller DownloadLaporanController --invokable// app/Http/Controllers/DownloadLaporanController.php
class DownloadLaporanController extends Controller
{
public function __invoke()
{
return response()->download(storage_path('app/laporan.pdf'));
}
}
// routes/web.php
Route::get('/laporan/download', DownloadLaporanController::class);Resource controller: CRUD sekali jalan
Untuk resource standar (index, create, store, show, edit, update, destroy), Laravel bisa men-generate semuanya:
php artisan make:controller PostController --resource --model=Post// routes/web.php
Route::resource('posts', PostController::class);Satu baris itu menghasilkan tujuh route RESTful sekaligus. Cek dengan php artisan route:list untuk melihat semuanya.
Catatan teknis: Controller sebaiknya kurus: validasi, query kompleks, dan logika bisnis yang panjang lebih baik dipindah ke Form Request, scope model, atau Service class. Aturan praktisnya, kalau satu method controller lebih dari 30 sampai 40 baris, itu sinyal untuk dipecah.