java php laravel linux mysql sql bootstrap html css query java php laravel linux mysql sql bootstrap html css query

Saturday, April 11, 2026

laravel upload file

📚 Seri Laravel #20 🚀 Intermediate PHP & Laravel

Upload File di Laravel:
Gambar, Dokumen, dan Lainnya

Pelajari cara upload file gambar dan dokumen di Laravel secara aman dan efisien — mulai dari konfigurasi storage hingga validasi tipe file.

⏱️ Estimasi baca: 12 menit
🎯 Level: Intermediate
📅 Diperbarui: 2025

Pernah nggak kamu download sebuah aplikasi web, terus bisa upload foto profil, kirim PDF lamaran, atau bahkan upload file Excel? Nah, fitur itu semua butuh sistem upload file yang solid di baliknya. Di Laravel, proses ini jauh lebih rapi dibanding PHP murni — tapi tetap butuh pemahaman yang benar agar file kamu nggak berserakan di server atau malah bocor ke publik.

Di artikel ke-20 dari seri 50 Artikel Belajar Laravel Lengkap ini, kita bakal kupas tuntas cara upload file di Laravel — mulai dari gambar, dokumen, sampai file umum lainnya. Oh iya, nanti kita juga nyinggung sedikit soal migration laravel karena tabel database juga perlu kita siapkan untuk menyimpan path file. Let's go!

📌 Konsep Inti: Upload File di Laravel

Upload file di Laravel bekerja lewat tiga komponen utama: Form HTML (dengan enctype multipart), Request Handler di Controller (menggunakan $request->file()), dan Storage Facade dari Laravel yang mengurus penyimpanan file secara aman dan terorganisir.

🗂️ Kenapa Upload File di Laravel Lebih Aman dari PHP Biasa?

Bayangkan kamu punya loker penyimpanan. Di PHP murni, kamu sering langsung lempar barang ke loker tanpa dicek dulu — siapa tahu yang masuk itu bom waktu alias file berbahaya. Laravel hadir dengan sistem yang lebih "dewasa": ada penjaga loker (validasi), ada label nama (rename otomatis), dan ada ruangan khusus yang terkunci (storage disk).

Laravel mengabstraksi kompleksitas upload file lewat beberapa fitur unggulan:

Fitur PHP Murni Laravel
Validasi tipe file Manual dengan mime_content_type() ✅ Rules bawaan (mimes, max)
Rename otomatis Kode manual diperlukan ✅ hashName() / store()
Multi-disk storage ❌ Tidak ada ✅ Local, S3, GCS, dll
Akses publik vs privat Konfigurasi server manual ✅ Storage::url() / disk()
Migration & path di DB Tidak ada integrasi ✅ Via migration laravel + Eloquent
🔥
Fakta Menarik

Menurut data OWASP, unrestricted file upload masuk dalam daftar 10 kerentanan web paling berbahaya. Artinya, salah handle upload file bisa bikin servermu jadi playground hacker. Laravel sudah punya mekanisme perlindungan bawaan — tapi kamu tetap harus menggunakannya dengan benar!

⚙️ Persiapan: Migration Laravel untuk Menyimpan Path File

Sebelum mulai upload, kita perlu menyiapkan database dulu. Nah, di sinilah migration laravel berperan penting — kita butuh kolom untuk menyimpan path file yang sudah diupload. Anggap saja migration seperti "blueprintnya" loker tempat kita simpan alamat file.

Sebagai contoh, kita akan membuat fitur upload foto profil untuk user. Berikut langkah-langkahnya:

1
Buat Migration Baru

Jalankan perintah ini di terminal untuk membuat file migration laravel baru:

php artisan make:migration add_avatar_to_users_table --table=users
2
Edit File Migration

Buka file migration yang baru dibuat, lalu tambahkan kolom avatar:

// database/migrations/xxxx_add_avatar_to_users_table.php
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('avatar')->nullable();
    });
}

public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropColumn('avatar');
    });
}
3
Jalankan Migration

Eksekusi migration laravel agar perubahan diterapkan ke database:

php artisan migrate
4
Buat Storage Link

Agar file bisa diakses publik melalui URL, jalankan perintah ini (cukup sekali per project):

php artisan storage:link
💡
Tips: Nullable di Migration

Selalu tambahkan ->nullable() pada kolom path file di migration laravel. Ini mencegah error ketika user belum mengupload file sama sekali — karena nilainya boleh kosong (NULL) di database.

📤 Implementasi Upload File: Form, Controller, dan Storage

Sekarang kita masuk ke inti dari migration laravel dan implementasi fitur upload. Ada tiga bagian yang perlu kita buat: form di Blade view, logika di Controller, dan konfigurasi storage. Kita akan buat semuanya step by step.

5
Buat Form Upload di Blade

Kunci utama: tambahkan enctype="multipart/form-data" di tag form. Tanpa ini, file tidak akan terkirim!

<!-- resources/views/profile/edit.blade.php -->
<form action="{{ route('profile.update') }}"
      method="POST"
      enctype="multipart/form-data">
    @csrf
    @method('PUT')

    <input type="file"
           name="avatar"
           accept="image/*">

    <button type="submit">Upload Foto</button>
</form>
6
Validasi & Simpan File di Controller

Inilah inti logikanya — validasi dulu, baru simpan. Metode store() otomatis memberi nama unik pada file:

// app/Http/Controllers/ProfileController.php
use Illuminate\Support\Facades\Storage;

public function update(Request $request)
{
    $request->validate([
        'avatar' => ['nullable', 'image', 'mimes:jpg,jpeg,png,webp', 'max:2048'],
    ]);

    if ($request->hasFile('avatar')) {
        // Hapus file lama jika ada
        if (auth()->user()->avatar) {
            Storage::disk('public')->delete(auth()->user()->avatar);
        }

        // Simpan file baru
        $path = $request->file('avatar')->store('avatars', 'public');

        auth()->user()->update(['avatar' => $path]);
    }

    return back()->with('success', 'Foto profil berhasil diperbarui!');
}
7
Tampilkan Gambar di Blade

Gunakan Storage::url() untuk mendapatkan URL publik dari file yang tersimpan:

<!-- Tampilkan foto profil -->
@if(auth()->user()->avatar)
    <img src="{{ Storage::url(auth()->user()->avatar) }}"
         alt="Foto Profil"
         style="width:100px;border-radius:50%;">
@else
    <img src="{{ asset('images/default-avatar.png') }}"
         alt="Avatar Default">
@endif
Insight Penting: store() vs storeAs()

store('avatars', 'public') menyimpan file dengan nama acak (hash) — lebih aman dan mencegah overwrite. Sedangkan storeAs('avatars', 'namafile.jpg', 'public') memberi kamu kontrol penuh atas nama file. Untuk upload user-generated content, selalu gunakan nama acak!

📄 Upload Dokumen & File Lainnya di Laravel

Upload bukan cuma soal gambar! Kamu mungkin butuh menerima PDF, Excel, atau file ZIP dari user. Konsepnya sama — yang berbeda hanya validasi rule-nya dan bagaimana kamu menyajikan file itu kembali ke user (preview vs download).

DocumentController.php
public function uploadDokumen(Request $request)
{
    $request->validate([
        'dokumen' => [
            'required',
            'file',
            'mimes:pdf,doc,docx,xlsx,xls',
            'max:5120', // Max 5MB
        ],
    ]);

    // Simpan ke folder 'documents' di disk 'local' (privat, tidak akses publik)
    $path = $request->file('dokumen')->store('documents');

    // Simpan path ke database menggunakan Eloquent
    Dokumen::create([
        'user_id' => auth()->id(),
        'path' => $path,
        'nama_asli' => $request->file('dokumen')->getClientOriginalName(),
    ]);

    return back()->with('success', 'Dokumen berhasil diupload!');
}
⚠️
Perhatian: Public vs Local Disk

Dokumen sensitif (KTP, kontrak, laporan keuangan) jangan disimpan di disk public! Gunakan disk local (default) dan sediakan route khusus dengan autentikasi untuk men-download file tersebut via Storage::download().

🔍 Pilih Disk yang Tepat untuk Kebutuhanmu
📂 Disk Public
  • Foto profil user
  • Thumbnail artikel/produk
  • Aset yang perlu URL publik
  • File yang di-embed di halaman web
🔒 Disk Local/Private
  • Dokumen identitas (KTP, SIM)
  • Kontrak & dokumen legal
  • Laporan keuangan
  • File internal perusahaan
💡
Tips Pro: Tambahkan fillable di Model

Jangan lupa tambahkan kolom avatar atau path ke array $fillable di Model kamu. Tanpa ini, Laravel akan menolak mass assignment dan file path tidak akan tersimpan ke database — bug yang sering bikin bingung pemula!

#Laravel #PHP #UploadFile #MigrationLaravel #Storage #BelajarLaravel #WebDevelopment
🎯

Kesimpulan Artikel

Di artikel ini kamu sudah mempelajari tiga hal krusial tentang upload file di Laravel:

Menyiapkan migration laravel untuk menyimpan path file di database dengan kolom nullable yang aman.

Membangun form, validasi, dan logika storage di Controller menggunakan Storage Facade Laravel.

Memilih disk yang tepat — public untuk aset yang perlu diakses bebas, local untuk dokumen sensitif.

Artikel ini adalah bagian dari seri 50 Artikel Belajar Laravel Lengkap. Kamu sudah selesai 20 dari 50 — keep it up! 🚀

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

laravel form validation

#Laravel #FormValidation #PHP #WebDev
Artikel 18 dari 50 · Seri Belajar Laravel Lengkap

Validasi Form di Laravel:
Cara yang Benar dan Efisien

Sudah capek data asal-asalan masuk ke database? Pelajari cara validasi form yang bersih, aman, dan bikin kode kamu makin profesional — langsung dari Laravel-nya.

⏱️
Estimasi Baca
10–12 Menit
🎯
Level
Beginner–Intermediate
📅
Tahun
2025

Pernah nggak kamu asal submit form dan ternyata semua field kosong bisa masuk ke database? Atau ada user yang iseng masukin email palsu, angka negatif, atau bahkan skrip berbahaya di kolom nama? Itulah kenapa validasi form di Laravel bukan sekadar fitur tambahan — ini adalah garis pertahanan pertama aplikasimu. Dalam seri 50 Artikel Belajar Laravel ini, kita sudah bahas cara buat form di Blade (Artikel 17), dan sekarang saatnya kita pastikan data yang masuk itu bersih, valid, dan aman.

Tenang, Laravel sudah nyediain sistem validasi yang powerful banget — dan surprisingly, mudah dipelajari. Yuk kita mulai!

📌 Definisi Penting

Validasi Form adalah proses memastikan bahwa data yang dikirimkan pengguna melalui form sesuai dengan aturan yang telah ditentukan — sebelum data tersebut diproses atau disimpan ke database.

🛡️ Kenapa Validasi Form di Laravel Itu Wajib?

Bayangkan kamu punya toko dan ada pelanggan yang mau checkout. Kamu pasti nggak langsung terima pembayaran tanpa ngecek: apakah barang dipilih? Apakah alamat pengiriman diisi? Apakah nomor kartu kredit valid? Nah, validasi form itu persis kayak kasir yang teliti — dia ngecek semua detail sebelum transaksi diproses.

Di dunia web, tanpa validasi, aplikasimu bisa jadi sarang bug, data kotor, bahkan celah keamanan. Laravel menyediakan mekanisme validasi yang terintegrasi langsung di controller maupun via Form Request — dan kita akan bahas keduanya.

🔥
Fakta Menarik

Menurut OWASP (Open Web Application Security Project), input yang tidak divalidasi masuk dalam daftar 10 kerentanan web paling berbahaya di dunia. Validasi bukan opsional — itu wajib!

⚖️ Analisis: Tanpa vs Dengan Validasi
Aspek ❌ Tanpa Validasi ✅ Dengan Validasi
Keamanan Rentan SQL Injection & XSS Data bersih & aman
Integritas Data Data bisa kosong/tidak konsisten Data selalu sesuai format
UX Pengguna Tidak ada feedback jelas Pesan error yang informatif
Debugging Bug sulit dilacak Error tertangkap sejak awal

⚙️ Cara Validasi Form di Laravel: Step by Step

Laravel punya dua cara utama untuk validasi: langsung di Controller menggunakan method $request->validate(), atau menggunakan Form Request (kita bahas detail di Artikel 19). Untuk sekarang, kita fokus ke cara pertama dulu yang paling cepat dipraktikkan.

1

Buat Route & Controller

Pastikan kamu sudah punya route untuk menampilkan form (GET) dan menerima data (POST). Kita pakai contoh form pendaftaran mahasiswa.

 routes/web.php
use App\Http\Controllers\MahasiswaController;

Route::get('/daftar', [MahasiswaController::class, 'create']);
Route::post('/daftar', [MahasiswaController::class, 'store']);
2

Tambahkan Validasi di Controller

Di method store(), tambahkan $request->validate() sebelum proses penyimpanan. Jika validasi gagal, Laravel otomatis redirect ke halaman sebelumnya dengan pesan error.

 app/Http/Controllers/MahasiswaController.php
public function store(Request $request)
{
    // 🛡️ Validasi data masuk
    $validated = $request->validate([
        'nama'      => 'required|string|max:100',
        'email'     => 'required|email|unique:mahasiswas,email',
        'nim'       => 'required|digits:10|unique:mahasiswas,nim',
        'angkatan'  => 'required|integer|min:2000|max:2025',
        'jurusan'   => 'required|in:TI,SI,MI,RPL',
    ]);

    // ✅ Jika lolos validasi, simpan ke database
    Mahasiswa::create($validated);

    return redirect('/daftar')
        ->with('sukses', 'Data mahasiswa berhasil disimpan!');
}
3

Tampilkan Pesan Error di Blade

Laravel secara otomatis mengirim variable $errors ke view. Tampilkan di Blade seperti ini:

 resources/views/daftar.blade.php
<!-- Tampilkan semua error -->
@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

<!-- Atau tampilkan per field -->
<input type="text" name="nama" value="{{ old('nama') }}">
@error('nama')
    <span class="text-danger">{{ $message }}</span>
@enderror
💡
Tips Pro

Selalu gunakan old('nama_field') di value input. Ini memastikan data yang sudah diketik tidak hilang saat validasi gagal — sangat penting untuk UX yang baik!

📋 Daftar Aturan Validasi Paling Sering Dipakai

Salah satu kekuatan terbesar validasi form di Laravel adalah koleksi aturannya yang super lengkap. Kamu bisa kombinasikan beberapa aturan sekaligus dengan tanda |. Berikut aturan-aturan yang paling sering kamu butuhkan:

Aturan Fungsi Contoh
requiredField wajib diisi'nama' => 'required'
emailFormat email valid'email' => 'email'
min:n / max:nPanjang/nilai minimum atau maksimum'umur' => 'min:17|max:99'
unique:table,colNilai harus unik di tabel tertentu'email' => 'unique:users'
confirmedHarus sama dengan field _confirmation'password' => 'confirmed'
in:val1,val2Nilai harus salah satu dari daftar'status' => 'in:aktif,nonaktif'
numeric / integerHarus berupa angka'nilai' => 'numeric'
nullableBoleh null/kosong'bio' => 'nullable|string'
Insight Penting

Aturan validasi bisa ditulis sebagai string (dipisah |) atau sebagai array. Untuk aturan yang lebih kompleks atau mengandung koma (seperti Rule::in([...])), selalu gunakan array untuk menghindari konflik parsing.

🌐 Kustomisasi Pesan Error Validasi Laravel

Secara default, pesan error Laravel berbahasa Inggris. Untungnya, kamu bisa dengan mudah menggantinya — bahkan per field. Ini bikin pesan error jauh lebih user-friendly dan relevan konteksnya.

 Custom Validation Messages
$request->validate([
    'email' => 'required|email|unique:users',
    'nim'   => 'required|digits:10',
], [
    // Format: 'field.rule' => 'pesan kustom'
    'email.required' => 'Email wajib diisi, ya!',
    'email.email'    => 'Format email tidak valid.',
    'email.unique'   => 'Email ini sudah terdaftar.',
    'nim.required'   => 'NIM harus diisi.',
    'nim.digits'     => 'NIM harus tepat 10 digit angka.',
]);
⚠️
Perhatian

Jangan pernah mengandalkan validasi hanya di sisi klien (JavaScript). Ini bisa di-bypass dengan mudah. Validasi server-side di Laravel adalah keharusan, bukan pelengkap. Gunakan keduanya untuk pengalaman terbaik.

4

Gunakan Bahasa Indonesia untuk Semua Pesan

Daripada atur per field, kamu bisa ganti seluruh file bahasa validasi Laravel. Install laravel-lang lalu jalankan:

# Install package bahasa
composer require laravel-lang/lang --dev
php artisan lang:add id

# Set locale di config/app.php
'locale' => 'id',
5

Test Validasimu!

Selalu coba submit form dengan data yang sengaja salah — field kosong, email tanpa @, angka di luar range — untuk memastikan setiap aturan bekerja sesuai harapan. Debugging validasi jauh lebih mudah jika dilakukan sejak awal.

💡
Tips Efisiensi

Untuk proyek skala besar, pertimbangkan memindahkan logika validasi ke Form Request (kelas terpisah). Ini membuat controller lebih bersih dan validasi lebih mudah diuji secara independen. Kita akan bahas ini detail di Artikel 19!

📝 Kesimpulan

Validasi Form di Laravel: Simpel, Kuat, dan Wajib Dikuasai

Di artikel ini kita sudah belajar:

  • Kenapa validasi form di Laravel itu esensial untuk keamanan dan integritas data
  • Cara menggunakan $request->validate() langsung di Controller
  • Daftar aturan validasi paling umum dan cara mengombinasikannya
  • Cara menampilkan pesan error di Blade dengan @error dan old()
  • Cara mengkustomisasi pesan error agar lebih ramah pengguna

Ini adalah bagian dari Seri 50 Artikel Belajar Laravel yang dirancang untuk membawa kamu dari nol sampai bisa membangun aplikasi web profesional. Artikel selanjutnya kita akan naik level dengan Form Request — cara validasi yang lebih rapi dan terstruktur.

#Laravel #PHP #FormValidation #WebDevelopment #BelajarLaravel #Tutorial

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