
Kalau controller kamu udah sampai ratusan bahkan ribuan baris… itu bukan keren, itu warning 🚨
Masalahnya apa?
Semua logic kamu numpuk di satu tempat mulai dari validasi, bisnis logic, sampai query database. Akhirnya? Code jadi susah dibaca, susah di-test, dan rawan bug.
Nah, di sinilah Service atau Action class kepake.
Dengan misahin logic ke layer terpisah, controller jadi lebih clean cukup handle request dan response aja.
Kapan harus pakai ini?
Kalau logic kamu mulai kompleks, dipakai berulang, atau butuh unit testing.
Kenapa penting?
Karena ini bikin code kamu lebih maintainable dan scalable, apalagi kalau project makin gede atau dikerjain tim.
Tapi inget, kalau project kamu masih kecil dan simpel, pakai ini bisa terasa overkill.
Jadi intinya pakai kalau memang dibutuhkan, bukan cuma ikut-ikutan ya heheheh 🤪
🚨 Contoh “Controller 1000 Baris” (BAD)
//UserController.php
public function store(Request $request)
{
//Validasi
$request->validate([
'name' => 'required',
'email' => 'required|email|unique:users',
'password' => 'required|min:6'
]);
//Logic bikin user
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => bcrypt($request->password)
]);
// Kirim email
Mail::to($user->email)->send(new WelcomeMail($user));
return response()->json($user);
}
❌ Masalah:
- Controller ngurus semuanya
- Susah di-test
- Kalau logic nambah → makin chaos
✅ Versi Clean pakai Service
Buat Service Class
php artisan make:class Services/CreateUserService
Isi Service
// app/Services/CreateUserService.php
namespace App\Services;
use App\Models\User;
use Illuminate\Support\Facades\Mail;
use App\Mail\WelcomeMail;
class CreateUserService
{
public function execute(array $data)
{
$user = User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password'])
]);
Mail::to($user->email)->send(new WelcomeMail($user));
return $user;
}
}
Pakai di Controller
use App\Services\CreateUserService;
public function store(Request $request, CreateUserService $service)
{
$request->validate([
'name' => 'required',
'email' => 'required|email|unique:users',
'password' => 'required|min:6'
]);
$user = $service->execute($request->all());
return response()->json($user);
}
🔥 Kenapa Ini Lebih Bagus?
- Controller jadi clean (fokus HTTP aja)
- Logic bisa dipakai ulang
- Lebih gampang unit testing
- Lebih scalable kalau fitur nambah
🧠 Kapan Harus Pakai Ini?
Gunakan Service kalau :
- Logic lebih dari sekadar CRUD sederhana
- Ada proses tambahan (email, API, dll)
- Logic dipakai di banyak tempat
- Project mulai gede / tim mulai banyak
Jangan dipakai kalau :
- Project kecil banget (overkill)
- Logic cuma 1–2 baris simpel
🎯 Analogi sederhananya gini
Controller itu kayak kasir. Service itu dapur. Kalau kasir ikut masak… ya chaos 😭