Controller — Laravel

Controller memisahkan logika dari route — membuat kode lebih terorganisir. Membuat controller: php artisan make:controller UserController Controller dasar…

Controller adalah class yang mengumpulkan kode penjawab request untuk satu fitur. Route-nya tinggal menunjuk: "alamat ini dijawab method itu". Bayangin meja layanan buku di perpustakaan. Petugas di pintu (route) cuma mengarahkan tamu, semua urusan buku dikerjakan di satu meja (controller), dan tiap urusan punya petugasnya sendiri: satu menunjukkan daftar, satu mencarikan satu buku (method).

🧪 Tebakan cepat: satu baris Route::resource('books', BookController::class); mendaftarkan berapa route: 1, 5, atau 7? Tebak dulu, jawabannya ada di bagian "Resource controller: tujuh method sekaligus".

Bikin controller

Controller dibuat dengan Artisan:

php artisan make:controller BookController
   INFO  Controller [app/Http/Controllers/BookController.php] created successfully.

File barunya masih kosong:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class BookController extends Controller
{
    //
}

Isi method-nya

Isi dua method untuk app Perpustakaan. Datanya masih array biasa; di pelajaran Eloquent, array ini diganti data dari database.

class BookController extends Controller
{
    private array $books = [
        1 => ['id' => 1, 'title' => 'Laskar Pelangi', 'author' => 'Andrea Hirata'],
        2 => ['id' => 2, 'title' => 'Bumi Manusia', 'author' => 'Pramoedya Ananta Toer'],
        3 => ['id' => 3, 'title' => 'Cantik Itu Luka', 'author' => 'Eka Kurniawan'],
    ];

    public function index()
    {
        return response()->json(array_values($this->books));
    }

    public function show(string $id)
    {
        if (! isset($this->books[$id])) {
            return response()->json(['message' => 'Buku tidak ditemukan'], 404);
        }

        return response()->json($this->books[$id]);
    }
}

Menghubungkan route ke controller

<?php

use App\Http\Controllers\BookController;
use Illuminate\Support\Facades\Route;

Route::get('/books', [BookController::class, 'index'])->name('books.index');
Route::get('/books/{id}', [BookController::class, 'show'])->name('books.show');

Saat route cocok, Laravel membuat objek BookController lalu memanggil method-nya:

Request Route Laravel memanggil Jawaban
GET /books books.index index() 200 daftar tiga buku
GET /books/2 books.show show('2') 200 {"id":2,"title":"Bumi Manusia",...}
GET /books/9 books.show show('9') 404 {"message":"Buku tidak ditemukan"}

Resource controller: tujuh method sekaligus

Fitur seperti buku hampir selalu butuh tujuh aksi yang sama. Artisan bisa langsung membuat ketujuh method-nya (kosong, berisi //):

php artisan make:controller BookController --resource

--resource boleh disingkat -r. Lalu satu baris route mendaftarkan semuanya:

Route::resource('books', BookController::class);
$ php artisan route:list --except-vendor

  GET|HEAD        books ................... books.index › BookController@index
  POST            books ................... books.store › BookController@store
  GET|HEAD        books/create .......... books.create › BookController@create
  GET|HEAD        books/{book} .............. books.show › BookController@show
  PUT|PATCH       books/{book} .......... books.update › BookController@update
  DELETE          books/{book} ........ books.destroy › BookController@destroy
  GET|HEAD        books/{book}/edit ......... books.edit › BookController@edit

                                                            Showing [7] routes

Tujuh route. Itu jawaban tebakannya. Ketujuh method-nya: index (daftar), create (form tambah), store (simpan yang baru), show (satu buku), edit (form ubah), update (simpan perubahan), destroy (hapus). Parameternya bernama {book}, bentuk tunggal dari books. /books/create didaftarkan sebelum /books/{book}, jadi jebakan urutan di pelajaran Routing gak terjadi.

Untuk API yang gak punya halaman form, pakai php artisan make:controller BookController --api dan Route::apiResource(...): lima route, tanpa create dan edit.

⚠️ Jebakan yang sering ketemu

TL;DR: Controller mengumpulkan kode penjawab request satu fitur dalam satu class di app/Http/Controllers. Buat dengan php artisan make:controller BookController, isi method-nya, lalu hubungkan dengan Route::get('/books', [BookController::class, 'index']) plus use App\Http\Controllers\BookController;. Parameter {id} masuk sebagai argumen method. --resource (atau -r) membuat tujuh method: index, create, store, show, edit, update, destroy, dan Route::resource('books', BookController::class) mendaftarkan tujuh route-nya. --api dan Route::apiResource membuat lima, tanpa create dan edit.

Yang akan kamu pelajari