Pernah nggak sih kamu ngerasa controller di project Laravel makin lama makin gendut? Awalnya cuma beberapa baris, eh lama-lama jadi penuh logika bisnis, validasi, sampai urusan database. Kalau sudah begini, debug jadi susah, testing makin ribet, dan kode makin sulit dirawat. Nah, di artikel ini kita bakal bahas cara refactor controller ke action class supaya kode Laravel kamu lebih rapi, modular, dan gampang di-maintain. Yuk, kita mulai step-by-step!
Kenapa Controller Sering Jadi “Monster”?
Waktu pertama kali belajar Laravel, controller memang jadi tempat utama buat handle request. Tapi, tanpa sadar, kita suka masukin semua logika ke situ: validasi, proses data, sampai simpan ke database. Akhirnya, controller jadi panjang dan susah dibaca. Ini wajar kok, hampir semua developer pernah ngalamin.
Apa Itu Action Class di Laravel?
Action class itu kayak “asisten pribadi” buat controller. Tugasnya: ngerjain satu aksi spesifik, misal menyimpan postingan baru. Dengan action class, controller jadi lebih ramping karena cukup delegasi tugas ke action. Mirip kayak chef yang punya asisten buat motong bahan, jadi chef bisa fokus plating dan rasa.
Manfaat Refactor ke Action Class
- Controller jadi lebih ramping dan fokus ke request/response
- Logika bisnis bisa dipakai ulang di command, event, atau job
- Testing lebih mudah karena bisa uji action class langsung
- Struktur kode lebih rapi dan gampang dicari
Studi Kasus: Sebelum & Sesudah Refactor
// Contoh controller sebelum refactor
public function store(Request $request)
{
$data = $request->validate([
'title' => 'required|string|max:255',
'body' => 'required|string',
]);
Post::create([
'title' => $data['title'],
'body' => $data['body'],
'author_id' => auth()->id(),
]);
return redirect()->route('posts.index')->with('success', 'Post created.');
}
// Setelah refactor pakai action class
public function store(StorePostAction $action, StorePostRequest $request)
{
$action->execute($request->validated());
return redirect()->route('posts.index')->with('success', 'Post created.');
}
Controller jadi lebih singkat, urusan “berat” dipindah ke action class.
Step-by-Step Membuat Action Class di Laravel
Buat Form Request untuk Validasi Jalankan perintah berikut di terminal:
php artisan make:request StorePostRequest
Contoh rules validasi:
public function rules(): array { return [ 'title' => ['required', 'string', 'max:255'], 'body' => ['required', 'string'], ]; }
Kenapa pakai Form Request? Supaya validasi lebih terstruktur dan mudah dipakai ulang.
Buat Action Class Jalankan:
php artisan make:class StorePostAction
Isi class-nya seperti ini:
namespace App\Actions; use App\Models\Post; class StorePostAction { public function execute(array $data): Post { return Post::create([ 'title' => $data['title'], 'body' => $data['body'], 'author_id' => auth()->id(), ]); } }
Dengan begini, logika simpan post dipisah dari controller.
Pakai Action Class di Controller Di controller, cukup inject action class dan form request:
public function store(StorePostAction $action, StorePostRequest $request) { $action->execute($request->validated()); return redirect()->route('posts.index')->with('success', 'Post created.'); }
Sekarang controller kamu jadi super ramping!
Testing Action Class Lebih Mudah
Karena logika sudah dipisah, kamu bisa test action class langsung tanpa harus simulasi HTTP request. Contoh test:
public function test_it_creates_a_post()
{
$user = User::factory()->create();
$this->actingAs($user);
$action = new StorePostAction();
$post = $action->execute([
'title' => 'Test Title',
'body' => 'This is a test body.',
]);
$this->assertDatabaseHas('posts', [
'title' => 'Test Title',
'author_id' => $user->id,
]);
}
Kamu nggak perlu lagi bikin POST request di test, cukup panggil action class-nya langsung.
Tips Praktis Biar Kode Makin Rapi
- Buat folder
Actions/
khusus untuk action class - Terapkan juga ke update, delete, dsb (misal:
UpdatePostAction
,DeletePostAction
) - Kalau butuh, inject service atau repository ke action class
- Selalu pisahkan logika bisnis dari controller
Apa yang Didapat Setelah Refactor?
- Controller lebih bersih dan mudah dibaca
- Logika bisnis bisa dipakai ulang di banyak tempat
- Testing lebih simpel
- Struktur project lebih terorganisir
- Kode lebih mudah di-maintain dan scalable
- Mendorong arsitektur yang lebih clean dan single responsibility
Penutup: Mulai Refactor, Rasakan Bedanya
Refactor ke action class itu langkah kecil yang dampaknya besar buat kualitas kode Laravel kamu. Begitu coba di satu controller, biasanya bakal ketagihan karena kode jadi lebih enak dibaca dan diatur. Coba deh refactor controller kamu hari ini, dan rasakan sendiri bedanya!
Resource & Dokumentasi Resmi:
Struktur Folder Sederhana:
app/
├── Actions/
│ └── StorePostAction.php
├── Http/
│ ├── Controllers/
│ │ └── PostController.php
│ └── Requests/
│ └── StorePostRequest.php
Versi Laravel yang direkomendasikan: 10.x atau 11.x
Tips Motivasi: Belajar refactor itu proses, nggak harus langsung semua controller diubah. Mulai dari satu fitur, rasakan manfaatnya, lalu lanjut ke bagian lain. Semangat, kamu pasti bisa bikin kode Laravel makin clean dan profesional!