> For the complete documentation index, see [llms.txt](https://learn.devlabss.my.id/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://learn.devlabss.my.id/laravel/bab-7-fitur-create-and-validasi/7.3-menerapkan-form-validation.md).

# 7.3 Menerapkan Form Validation

## Menerapkan form validation

Form tambah buku Anda sekarang sudah bisa mengirim data.

Tetapi ada satu masalah penting.

Form yang bisa dikirim belum tentu berisi data yang benar.

Kalau pengguna mengirim data kosong, data asal-asalan, atau format yang salah, database bisa ikut berantakan.

Karena itu, kita perlu **validasi**.

### Teori awal dan analogi

Bayangkan petugas perpustakaan menerima formulir buku baru.

Sebelum formulir dimasukkan ke sistem, petugas akan memeriksa isinya dulu.

Kalau judul kosong, formulir ditolak.

Kalau tahun terbit tidak masuk akal, formulir juga ditahan dulu.

Validasi di Laravel bekerja seperti pemeriksaan itu.

Data dicek lebih dulu.

Kalau lolos, data disimpan.

Kalau gagal, pengguna diminta memperbaiki inputnya.

### Target praktik subbab ini

Setelah menyelesaikan subbab ini, Anda seharusnya bisa:

* menambahkan aturan validasi di method `store()`
* menampilkan pesan error di halaman form
* mengembalikan input lama dengan `old()`
* menyimpan data ke database dengan aman

### Langkah praktik step-by-step

Ikuti langkah berikut dengan urut.

{% stepper %}
{% step %}

### Tambahkan field yang boleh disimpan pada model

Buka file:

`app/Models/Buku.php`

Lalu ubah model Anda menjadi seperti ini:

```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Buku extends Model
{
    use HasFactory;

    protected $table = 'buku';

    protected $fillable = [
        'judul',
        'penulis',
        'penerbit',
        'tahun_terbit',
    ];
}
```

Bagian `$fillable` penting agar Laravel mengizinkan field tersebut disimpan dengan `create()`.
{% endstep %}

{% step %}

### Ubah method `store()` agar memakai validasi

Buka file:

`app/Http/Controllers/BukuController.php`

Lalu ubah method `store()` menjadi seperti ini:

```php
public function store(Request $request)
{
    $validated = $request->validate([
        'judul' => 'required|string|max:255',
        'penulis' => 'required|string|max:255',
        'penerbit' => 'required|string|max:255',
        'tahun_terbit' => 'required|digits:4',
    ]);

    Buku::create($validated);

    return redirect()->route('buku.index')
        ->with('success', 'Data buku berhasil ditambahkan.');
}
```

Sekarang data yang lolos validasi akan langsung disimpan ke tabel `buku`.
{% endstep %}

{% step %}

### Tampilkan pesan sukses di halaman daftar buku

Buka file:

`resources/views/buku/index.blade.php`

Tambahkan potongan ini di bawah judul halaman atau di atas tabel:

```blade
@if (session('success'))
    <p>{{ session('success') }}</p>
@endif
```

Pesan ini akan muncul setelah data berhasil disimpan.
{% endstep %}

{% step %}

### Lengkapi form agar bisa menampilkan error

Buka file:

`resources/views/buku/create.blade.php`

Lalu ubah isinya menjadi seperti ini:

```blade
<h1>Tambah Buku</h1>

<form action="{{ route('buku.store') }}" method="POST">
    @csrf

    <div>
        <label>Judul Buku</label>
        <input type="text" name="judul" value="{{ old('judul') }}">
        @error('judul')
            <small>{{ $message }}</small>
        @enderror
    </div>

    <div>
        <label>Penulis</label>
        <input type="text" name="penulis" value="{{ old('penulis') }}">
        @error('penulis')
            <small>{{ $message }}</small>
        @enderror
    </div>

    <div>
        <label>Penerbit</label>
        <input type="text" name="penerbit" value="{{ old('penerbit') }}">
        @error('penerbit')
            <small>{{ $message }}</small>
        @enderror
    </div>

    <div>
        <label>Tahun Terbit</label>
        <input type="number" name="tahun_terbit" value="{{ old('tahun_terbit') }}">
        @error('tahun_terbit')
            <small>{{ $message }}</small>
        @enderror
    </div>

    <button type="submit">Simpan</button>
</form>
```

Sekarang form bisa menampilkan pesan error di setiap field.
{% endstep %}

{% step %}

### Uji validasi di browser

Sebelum mengetes, pastikan server Laravel hidup.

Silakan pilih salah satu:

* buka **Laragon** lalu klik **Start All**
* atau jalankan `php artisan serve`

Setelah itu, buka:

```
http://127.0.0.1:8000/buku/create
```

Coba langsung klik **Simpan** tanpa mengisi apa pun.

Kalau berhasil, Laravel akan mengembalikan Anda ke form dan menampilkan pesan error.
{% endstep %}

{% step %}

### Uji simpan data yang benar

Sekarang isi semua field dengan data yang benar.

Lalu klik **Simpan** lagi.

Kalau berhasil:

* data akan masuk ke tabel `buku`
* halaman akan kembali ke daftar buku
* pesan sukses akan muncul
* buku baru akan terlihat di tabel
  {% endstep %}
  {% endstepper %}

### Penjelasan pasca-praktik

Sekarang mari kita bedah bagian yang paling penting.

#### 1. `$request->validate([...])`

Baris ini memeriksa isi request berdasarkan aturan yang Anda tentukan.

Kalau ada yang gagal, Laravel otomatis:

* membatalkan proses simpan
* mengembalikan pengguna ke halaman sebelumnya
* membawa pesan error
* membawa input lama

#### 2. Aturan `required|string|max:255`

Artinya field tersebut:

* wajib diisi
* harus berupa teks
* panjang maksimalnya 255 karakter

Aturan ini cocok untuk `judul`, `penulis`, dan `penerbit`.

#### 3. Aturan `required|digits:4`

Aturan ini dipakai untuk `tahun_terbit`.

Laravel akan meminta nilai berupa angka dengan panjang empat digit.

Contohnya `2026`.

#### 4. `Buku::create($validated)`

Baris ini menyimpan data yang sudah lolos validasi ke database.

Karena kita memakai `$fillable`, Laravel tahu field mana yang aman untuk disimpan.

#### 5. `old('judul')`

Fungsi ini menampilkan input lama saat validasi gagal.

Jadi pengguna tidak perlu mengetik ulang dari awal.

#### 6. `@error('judul')`

Bagian ini menampilkan pesan error khusus untuk field tertentu.

Kalau field `judul` gagal validasi, pesan error akan muncul tepat di bawah inputnya.

### Alur data teknis

Saat tombol **Simpan** ditekan, alurnya seperti ini:

1. form mengirim request `POST`
2. method `store()` menerima request
3. Laravel menjalankan validasi
4. jika gagal, pengguna dikembalikan ke form
5. jika lolos, data disimpan dengan `Buku::create()`
6. pengguna diarahkan ke halaman daftar buku
7. pesan sukses tampil di halaman index

Inilah alur inti fitur **create** yang rapi dan aman.

### Output yang harus terlihat

Setelah subbab ini selesai, hasil berikut seharusnya sudah terlihat:

* model `Buku` punya properti `$fillable`
* form menampilkan pesan error di bawah field yang salah
* input lama kembali muncul setelah validasi gagal
* data valid berhasil tersimpan ke tabel `buku`
* halaman daftar buku menampilkan pesan sukses dan baris data baru

### Troubleshooting yang paling sering

Masalah yang paling sering muncul:

* **`Add [judul] to fillable property`** — model belum punya `$fillable`
* **pesan error tidak muncul** — `@error()` belum ditulis atau nama field salah
* **input lama tidak kembali** — `old()` belum dipasang di input
* **data tidak tersimpan** — validasi gagal atau method `store()` belum benar

{% hint style="warning" %}
Kalau Anda memakai `Buku::create()` tanpa `$fillable`, Laravel biasanya menolak proses simpan demi keamanan.
{% endhint %}

{% hint style="info" %}
Validasi bukan pengganggu. Validasi justru penjaga kualitas data sebelum masuk ke database.
{% endhint %}

### Poin evaluasi bab 7.3

Pastikan Anda sudah memahami poin berikut:

* Saya bisa menulis aturan validasi di `store()`.
* Saya tahu fungsi `$fillable` pada model.
* Saya bisa menampilkan pesan error per field.
* Saya bisa memakai `old()` agar input lama tidak hilang.
* Saya bisa menyimpan data buku yang lolos validasi ke database.

Jika semuanya sudah jelas, lanjut ke [7.4 Penjelasan Alur Tangkap Error](/laravel/bab-7-fitur-create-and-validasi/7.4-penjelasan-alur-tangkap-error.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://learn.devlabss.my.id/laravel/bab-7-fitur-create-and-validasi/7.3-menerapkan-form-validation.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
