📚 SERI BELAJAR LARAVEL LENGKAP — ARTIKEL 19 DARI 50
Form Request: Validasi yang Lebih Rapi dan Terpisah
Capek nulis validasi langsung di controller? Saatnya kenalan dengan Form Request — cara Laravel yang elegan untuk memisahkan logika validasi dari kekacauan controller kamu.
#FormRequest#Laravel#PHP#WebDevelopment#Tutorial
⏱️
Estimasi Baca
10 Menit
🎯
Level
Intermediate
📅
Update
2025
🚀
Laravel
v11.x
Pernah nggak kamu buka controller Laravel-mu sendiri dan bingung... "ini validasi form-nya di mana sih?" Baris kode validasi nyempil di antara logika bisnis, query database, dan response handler — semuanya jadi satu kekacauan besar. Kalau kamu pernah ngalamin ini, selamat datang di artikel yang tepat! Di seri 50 Artikel Belajar Laravel ini, kita sampai di artikel ke-19 yang bakal jadi game-changer cara kamu nulis kode.
Setelah di artikel sebelumnya kita belajar validasi form secara langsung di controller, sekarang saatnya naik level. Form Request adalah fitur Laravel yang memungkinkan kamu memisahkan logika validasi ke kelas tersendiri — bersih, rapi, dan mudah di-maintain. Konsep ini erat kaitannya dengan migration Laravel dalam hal prinsip separation of concerns: setiap komponen punya tugasnya sendiri, tidak ada yang campur aduk.
Siap? Mari kita bedah Form Request dari nol sampai bisa kamu pakai langsung di project-mu! 💪
📐 DEFINISI KUNCI
"Form Request adalah kelas PHP khusus di Laravel yang bertugas menampung aturan validasi dan logika otorisasi form, terpisah dari controller."
Form Request merupakan turunan dari Illuminate\Foundation\Http\FormRequest — sebuah kelas yang secara otomatis menjalankan validasi sebelum method controller kamu dipanggil.
1. Apa Itu Form Request dan Kenapa Kamu Butuh Ini?
Bayangkan kamu punya kost-kostan. Di dalam satu kamar ada kasur, lemari, meja belajar, kompor, dan juga barang-barang dapur. Sesak banget, kan? Itulah analoginya kalau kamu naruh validasi, logika bisnis, dan response di satu controller yang sama.
Form Request adalah solusi Laravel yang mengatakan: "Hei, pindahin validasi kamu ke kamar sendiri!" Dengan ini, controller-mu jadi ramping dan fokus pada tugasnya — memproses request dan mengembalikan response. Sama seperti konsep migration Laravel yang memisahkan definisi struktur database dari kode aplikasi, Form Request memisahkan definisi validasi dari logika controller.
Manfaat utama yang langsung kamu rasakan:
Aspek
❌ Validasi di Controller
✅ Form Request
Kerapian Kode
Controller jadi panjang & berantakan
Controller tetap bersih & fokus
Reusability
Harus copy-paste di setiap method
Satu kelas, dipakai di mana saja
Testability
Susah di-test secara terpisah
Mudah di-unit test secara mandiri
Otorisasi
Harus tulis sendiri secara manual
Ada method authorize() bawaan
Pesan Error Custom
Bisa, tapi agak ribet
Punya method messages() sendiri
💡 TIPS PRAKTIS
Gunakan Form Request setiap kali form-mu punya lebih dari 3 field atau logika validasinya mulai kompleks. Untuk form sederhana dengan 1-2 field, validasi langsung di controller masih acceptable. Tapi untuk production app, selalu biasakan pakai Form Request dari awal!
2. Migration Laravel dan Form Request: Cara Membuat & Menggunakannya
Sama seperti saat kamu membuat migration Laravel dengan perintah artisan, membuat Form Request pun sesederhana satu baris perintah. Laravel sudah menyiapkan semuanya untukmu — kamu tinggal isi aturannya!
Ikuti langkah-langkah berikut secara berurutan:
1
Generate Form Request via Artisan
Jalankan perintah berikut di terminal. Misalnya kita mau buat validasi untuk form artikel:
terminal
$php artisanmake:requestStoreArticleRequest
File baru akan dibuat di: app/Http/Requests/StoreArticleRequest.php
2
Isi Method rules() dan authorize()
Buka file yang baru dibuat dan isi kedua method wajib ini:
app/Http/Requests/StoreArticleRequest.php
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
classStoreArticleRequestextendsFormRequest
{
/**
* Tentukan apakah user boleh melakukan request ini.
*/public functionauthorize(): bool
{
returntrue; // Ubah ke false jika perlu batasi akses
}
/**
* Aturan validasi yang berlaku untuk request ini.
*/public functionrules(): array
{
return [
'title' => 'required|string|max:255',
'body' => 'required|string|min:50',
'category' => 'required|exists:categories,id',
'tags' => 'nullable|array',
'tags.*' => 'exists:tags,id',
'published' => 'boolean',
];
}
/**
* Pesan error custom (opsional tapi direkomendasikan!)
*/public functionmessages(): array
{
return [
'title.required' => 'Judul artikel wajib diisi!',
'title.max' => 'Judul tidak boleh lebih dari 255 karakter.',
'body.required' => 'Isi artikel tidak boleh kosong!',
'body.min' => 'Artikel minimal 50 karakter.',
'category.required' => 'Pilih kategori artikel terlebih dahulu.',
'category.exists' => 'Kategori yang dipilih tidak valid.',
];
}
}
3
Gunakan di Controller — Tinggal Type-hint!
Ini bagian yang paling menyenangkan. Controller-mu jadi super bersih:
app/Http/Controllers/ArticleController.php
<?php
namespace App\Http\Controllers;
use App\Http\Requests\StoreArticleRequest;
use App\Models\Article;
classArticleControllerextendsController
{
// ✅ BERSIH! Tidak ada logika validasi sama sekali.public functionstore(StoreArticleRequest$request)
{
// Validasi sudah otomatis berjalan sebelum baris ini!
$article = Article::create($request->validated());
returnredirect()->route('articles.show', $article)
->with('success', 'Artikel berhasil disimpan!');
}
}
✅ Perhatikan: $request->validated() hanya mengembalikan data yang sudah divalidasi — aman dari input berbahaya!
⚡ INSIGHT PENTING
Ketika validasi gagal, Laravel secara otomatis redirect ke halaman sebelumnya beserta error messages dan input lama (old input). Kamu tidak perlu menulis redirect manual! Untuk API request (menggunakan header Accept: application/json), Laravel akan otomatis mengembalikan response JSON 422 Unprocessable Entity.
3. Fitur Lanjutan Form Request yang Wajib Kamu Tahu
Form Request bukan sekadar tempat menaruh aturan validasi. Ada beberapa fitur canggih yang bisa bikin kode kamu makin powerful. Ini adalah fitur-fitur yang membedakan developer junior dari yang senior!
4
prepareForValidation() — Bersihkan Data Sebelum Divalidasi
Method ini dipanggil sebelum validasi berjalan. Cocok untuk normalisasi data input:
StoreArticleRequest.php — method tambahan
/**
* Transformasi input sebelum validasi dijalankan
*/protected functionprepareForValidation(): void
{
// Otomatis buat slug dari title
$this->merge([
'slug' => str($this->title)->slug()->value(),
'user_id' => auth()->id(),
// Pastikan 'published' selalu boolean'published' => $this->boolean('published'),
]);
}
5
withValidator() — Tambah Logika Validasi Kompleks
Untuk aturan validasi yang tidak bisa diekspresikan dengan string rules biasa:
StoreArticleRequest.php — withValidator
public functionwithValidator($validator): void
{
$validator->after(function ($validator) {
// Validasi: title tidak boleh mengandung kata terlarang
$forbiddenWords = ['spam', 'judi', 'iklan'];
foreach ($forbiddenWords as $word) {
if (str_contains(strtolower($this->title), $word)) {
$validator->errors()->add(
'title',
"Judul tidak boleh mengandung kata '{$word}'."
);
}
}
});
}
🔥 FAKTA MENARIK
Dalam survei State of PHP 2024, lebih dari 78% developer Laravel profesional menggunakan Form Request sebagai standar wajib dalam setiap project mereka. Ini bukan sekadar best practice — ini sudah menjadi standar industri untuk aplikasi Laravel yang maintainable.
4. Otorisasi di Form Request dan Tips Pro untuk Migration Laravel Project
Method authorize() adalah fitur tersembunyi Form Request yang sering diremehkan. Ini bukan hanya soal validasi data — ini tentang validasi siapa yang boleh melakukan aksi tersebut.
UpdateArticleRequest.php — authorize() yang powerful
use App\Models\Article;
public functionauthorize(): bool
{
// Ambil artikel berdasarkan route parameter
$article = Article::findOrFail($this->route('article'));
// Hanya pemilik artikel yang boleh mengeditreturn $article->user_id === auth()->id();
}
public functionrules(): array
{
return [
'title' => 'required|string|max:255',
'body' => 'required|string|min:50',
];
}
⚠️ PERHATIAN
Jika method authorize() mengembalikan false, Laravel akan otomatis melempar HTTP 403 Forbidden. Pastikan untuk selalu mengubah nilai authorize() ke true atau menulis logika yang tepat — jangan sampai kamu lupa mengubahnya dari default false dan semua request ditolak!
🔍 ANALISIS MENDALAM: Kapan Tidak Pakai Form Request?
Meski Form Request sangat direkomendasikan, ada beberapa skenario di mana kamu mungkin memilih opsi lain:
🔴 Prototype / POC Untuk proof-of-concept yang akan dibuang, overhead membuat kelas terpisah tidak sepadan. Gunakan validasi langsung di controller.
🟡 Validasi Sangat Sederhana Form dengan 1-2 field dan aturan minimal seperti hanya required. Pertimbangkan keseimbangan antara kerapian kode dan overhead kelas baru.
🟢 Validasi Dinamis dari Database Jika aturan validasi berubah berdasarkan data yang sangat dinamis, pertimbangkan custom validation rules yang lebih fleksibel dikombinasikan dengan Form Request.
⚡ PRO TIPS: PENAMAAN YANG KONSISTEN
Gunakan konvensi penamaan yang jelas: StoreArticleRequest untuk create, UpdateArticleRequest untuk update, dan DestroyArticleRequest untuk delete jika perlu otorisasi khusus. Konsistensi ini penting agar tim kamu mudah memahami struktur kode tanpa harus membukanya satu per satu. Persis seperti penamaan migration Laravel yang deskriptif: create_articles_table lebih baik dari sekadar articles.
🎯 KESIMPULAN
Form Request: Dari Controller Berantakan ke Kode yang Elegan
Di artikel ke-19 dari seri 50 Artikel Belajar Laravel ini, kita telah menjelajahi Form Request — fitur yang transformatif untuk cara kamu menulis validasi. Berikut ringkasan poin-poin utamanya:
✦Form Request memisahkan validasi ke kelas tersendiri, membuat controller tetap bersih dan fokus pada logika bisnis.
✦Buat dengan php artisan make:request NamaRequest, isi rules() dan authorize(), lalu type-hint di controller.
✦Gunakan messages() untuk pesan error yang user-friendly, dan prepareForValidation() untuk normalisasi data.
✦Prinsip separation of concerns ini sama seperti migration Laravel — setiap komponen punya tanggung jawabnya sendiri.
✦Selalu gunakan $request->validated() di controller — bukan $request->all() — untuk keamanan maksimal.
Artikel ini bermanfaat? Tunjukkan ke teman-teman yang lagi belajar Laravel! 👇
saifiahmada.com adalah blog belajar programming Indonesia, membahas lengkap materi bahasa pemrograman: code HTML, CSS, Bootstrap, Desain, PHP, MySQL, coding Java, Query, SQL, dan dunia linux
No comments:
Post a Comment