laravelcontrollermvcPemula3 mnt baca

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:

bash
php artisan make:controller PostController

File dibuat di app/Http/Controllers/PostController.php:

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:

php
// 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:

bash
php artisan make:controller DownloadLaporanController --invokable
php
// 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:

bash
php artisan make:controller PostController --resource --model=Post
php
// 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.