M
Mr Sugiarto
Developer
23 Aug 2026 3 min read

Menulis semua logic langsung di routes/web.php cepat berantakan begitu aplikasi tumbuh. Solusinya: pindahkan logic ke controller — class khusus yang bertanggung jawab menangani request untuk satu topik tertentu, dalam kasus kita: Post.

Screenshot: Placeholder response dari tiap method resource controller, sebelum dihubungkan ke database. Placeholder response dari tiap method resource controller, sebelum dihubungkan ke database.

Membuat resource controller

Laravel punya generator bawaan untuk membuat controller dengan 7 method standar (CRUD lengkap) sekaligus:

php artisan make:controller PostController --resource

Perintah ini generate app/Http/Controllers/PostController.php dengan 7 method kosong:

class PostController extends Controller
{
    public function index() {}      // GET /posts
    public function create() {}     // GET /posts/create
    public function store(Request $request) {}   // POST /posts
    public function show(string $id) {}           // GET /posts/{id}
    public function edit(string $id) {}            // GET /posts/{id}/edit
    public function update(Request $request, string $id) {}  // PUT/PATCH /posts/{id}
    public function destroy(string $id) {}          // DELETE /posts/{id}
}

Ketujuh method ini bukan angka sembarang — ini adalah pola RESTful resource standar yang dipakai hampir di semua framework web modern: list, form create, simpan, detail, form edit, update, hapus.

Mendaftarkan resource route

Alih-alih menulis 7 baris Route::get(), Route::post(), dst secara manual, Laravel menyediakan satu baris ajaib:

use App\Http\Controllers\PostController;

Route::resource('posts', PostController::class);

Satu baris ini otomatis mendaftarkan semua 7 route sekaligus, lengkap dengan nama route standar (posts.index, posts.show, dst). Cek hasilnya:

php artisan route:list --path=posts
GET|HEAD   posts              posts.index    › PostController@index
POST       posts              posts.store    › PostController@store
GET|HEAD   posts/create       posts.create   › PostController@create
GET|HEAD   posts/{post}       posts.show     › PostController@show
PUT|PATCH  posts/{post}       posts.update   › PostController@update
DELETE     posts/{post}       posts.destroy  › PostController@destroy
GET|HEAD   posts/{post}/edit  posts.edit     › PostController@edit

Mengisi method sementara

Karena kita belum punya model dan database posts (itu baru di episode 7-8), untuk sekarang tiap method cukup mengembalikan teks penanda supaya kita bisa memverifikasi routing-nya benar:

public function index()
{
    return 'PostController@index - GET /posts - list all posts';
}

public function show(string $id)
{
    return "PostController@show - GET /posts/{$id} - post #{$id} detail";
}

Kenapa urutan route penting

Satu jebakan klasik: route /posts/create bisa "tertangkap" duluan oleh pattern /posts/{post} kalau urutan registrasinya salah, karena create dianggap sebagai nilai parameter {post}. Untungnya Route::resource() sudah mendaftarkan route dalam urutan yang benar secara otomatis — create didaftarkan sebelum {post} — jadi kita tidak perlu khawatir soal ini selama pakai resource route standar.

Testing

curl http://laravel13-blog-dasar.test/posts
curl http://laravel13-blog-dasar.test/posts/create
curl http://laravel13-blog-dasar.test/posts/7
curl http://laravel13-blog-dasar.test/posts/7/edit

Masing-masing akan menampilkan teks penanda sesuai method yang dipanggil — bukti routing sudah terhubung dengan benar ke controller.

Selanjutnya

Sekarang logic sudah rapi di controller, tapi tampilan HTML kita masih ditulis manual di setiap file blade. Episode berikutnya kita rapikan itu juga lewat blade templating: layout, include, dan component.

M
Mr Sugiarto

Developer

Bagian dari Series: Laravel 13 Dasar — Belajar Fundamental Lewat Blog Sederhana
Lihat Series Lengkap