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.
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.