laravel form request | java php laravel linux mysql sql bootstrap html css query java php laravel linux mysql sql bootstrap html css query: laravel form request

Saturday, April 11, 2026

laravel form request

📚 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 artisan make:request StoreArticleRequest
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;

class StoreArticleRequest extends FormRequest
{
    /**
     * Tentukan apakah user boleh melakukan request ini.
     */
    public function authorize(): bool
    {
        return true; // Ubah ke false jika perlu batasi akses
    }

    /**
     * Aturan validasi yang berlaku untuk request ini.
     */
    public function rules(): 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 function messages(): 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;

class ArticleController extends Controller
{
    // ✅ BERSIH! Tidak ada logika validasi sama sekali.
    public function store(StoreArticleRequest $request)
    {
        // Validasi sudah otomatis berjalan sebelum baris ini!
        $article = Article::create($request->validated());
        
        return redirect()->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 function prepareForValidation(): 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 function withValidator($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 function authorize(): bool
{
    // Ambil artikel berdasarkan route parameter
    $article = Article::findOrFail($this->route('article'));
    
    // Hanya pemilik artikel yang boleh mengedit
    return $article->user_id === auth()->id();
}

public function rules(): 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! 👇

Tags Artikel:
#Laravel #FormRequest #PHP #Validasi #WebDev #MigrationLaravel #BelajarLaravel #Tutorial2025
📚 NAVIGASI SERI — 50 ARTIKEL BELAJAR LARAVEL

No comments:

Post a Comment

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