Pernah nggak sih, kamu buka code Laravel yang ditulis beberapa bulan lalu, terus kamu sendiri bingung "bagian code ini maksutnya apa ya? duh aku lupa" atau lebih parah lagi, takut nge-fix bug karena khawatir bakal bikin error di tempat lain? Nah, itu tandanya code kamu butuh improvement dalam hal maintainability.
Laravel sudah dilengkapi dengan berbagai fitur-fitur yang keren, tapi sayangnya banyak developer yang masih mengulangi kesalahan-kesalahan klasik yang bikin code mereka menjadi nightmare buat di-maintain. Di artikel ini, kita akan bahas kesalahan-kesalahan umum tersebut dan bagaimana cara menghindarinya.
Fat Controller Syndrome
Ini salah satu kesalahan yang paling sering dilakukan, bahkan developer yang sudah berpengalaman sekalipun. Controller yang gemuk dengan ratusan baris code logic, validation, database query, sampai business logic semua di implementasikan jadi satu pada controller.
❌ Wrong Examples
public function store(Request $request) {
// 50 lines validation code + custom error mesagges
// 30 line data processing
// 20 line database query
// 15 line notification logic
}
Contoh kode diatas akan jadi bermasalah di masa mendatang, kenapa? Karena ketika kamu atau tim kamu perlu mengubah satu fitur kecil, kamu harus baca dan pahami ratusan baris code. Belum lagi kalau ada bug, debugging jadi lebih lama.
Solusinya adalah gunakan Service Pattern atau Action Pattern dengan memisahkan business logic ke class tersendiri. Controller cukup jadi koordinator yang memanggil service-service yang dibutuhkan saja.
Form Request Validation Sering Dianggap Tidak Penting
Banyak developer laravel yang malas bikin Form Request class dan lebih suka melakukan validasi input secara langsung di controller dengan method $request->validate(). Memang lebih cepat di awal, tapi bisa jadi bumerang nanti. Masalahnya, validation logic kamu jadi tersebar di berbagai controller. Misal ada perubahan aturan validasi email, kamu harus cari satu-satu di semua controller.
❌ Wrong Example
public function store(Request $request) {
$validation = $request->validate([
'username' => 'required|string',
'password' => 'required|min:8'
], [
'username.required' => 'Username cannot be null',
'password.min' => 'Minimal chars for password is 8'
]);
// other code
}
Selalu gunakan Form Request untuk validation agar membuat code lebih terorganisir dan reusable.
php artisan make:request StoreUserRequest
✅ Good Example
public function rules(): array
{
return [
'name' => 'required|string',
'password' => 'required|min:8',
];
}
public function messages(): array
{
return [
'username.required' => 'Username cannot be null',
'password.min' => 'Minimal chars for password is 8'
];
}
Lalu ubah controller menjadi seperti ini:
public function (StoreUserRequest $request) {
User::create($request->validated());
}
Terlihat lebih clean dan rapih kan?
Tidak Menggunakan Database Transaction
Bayangkan saja kita memiliki skenario seperti ini: Code kamu mengurangi saldo user A, tapi sebelum menambah saldo user B, terjadi error. Hasilnya? uang user A hilang begitu saja.
❌ Wrong Example
$sender->balance -= $amount;
$sender->save();
// An error occurred here
$receiver->balance += $amount;
$receiver->save();
Maka dari itu gunakan database transaction untuk operasi yang melibatkan multiple queries seperti dibawah ini:
✅ Good Example
DB::transaction(function () use ($sender, $receiver, $amount) {
$sender->decrement('balance', $amount);
$receiver->increment('balance', $amount);
});
N+1 Query Problem
N+1 Query terjadi ketika aplikasi menjalankan 1 query untuk mengambil kumpulan data utama, lalu menjalankan N query tambahan di dalam loop untuk mengambil relasi tiap item, sehingga total menjadi N+1 query yang seharusnya bisa dipangkas menjadi jauh lebih sedikit dengan teknik yang tepat.
Tanpa kamu sadari N+1 Query membuat aplikasimu berjalan menjadi lambat dan tentunya mengganggu performa.
❌ Wrong Example
$posts = Post::all();
foreach ($posts as $post) {
echo $post->user->name; // Query user for each post
}
✅ Good Example
$posts = Post::with('user')->get();
Melakukan Query Langsung di Blade Template
Ini kesalahan fatal yang sering dilakukan pemula. Menulis query Eloquent langsung di file blade:
@foreach(User::where('active', 1)->get() as $user)
<li>{{ $user->name }}</li>
@endforeach
Kenapa ini berbahaya dan sama sekali tidak disarankan? Pertama, performa jadi lambat karena query dieksekusi setiap kali template di-render. Kedua, mixing business logic dengan presentation layer melanggar prinsip separation of concerns.
Kesimpulan
Maintainability bukan sesuatu yang terjadi secara ajaib. Itu adalah hasil dari keputusan-keputusan kecil yang konsisten setiap hari. Hindari kesalahan-kesalahan di atas, dan code Laravel kamu akan jadi lebih mudah di-maintain, lebih mudah di scaling, dan lebih mudah dikerjakan dengan tim.
Remember, good code adalah code yang mudah diubah. Kalau code kamu mudah di-maintain, artinya kamu sudah on the right track. Thanks you!
.webp)
