Tutorial Laravel #15: Form Validation di Laravel
1. Validasi di Laravel
Laravel menyediakan sistem validasi yang sangat powerful dan fleksibel. Ada tiga cara utama melakukan validasi: langsung di controller, menggunakan Form Request class, atau menggunakan Validator facade.
2. Validasi di Controller
public function store(Request $request)
{
$request->validate([
'judul' => ['required', 'string', 'max:200'],
'email' => ['required', 'email', 'unique:users,email'],
'password' => ['required', 'min:8', 'confirmed'],
'umur' => ['required', 'integer', 'min:17', 'max:99'],
'gambar' => ['nullable', 'image', 'mimes:jpg,png,webp', 'max:2048'],
]);
// Lanjutkan jika valid...
}
3. Form Request Class - Cara yang Lebih Rapi
Form Request memisahkan logika validasi ke class tersendiri - sangat disarankan untuk project yang lebih besar:
php artisan make:request StoreArtikelRequest
php artisan make:request UpdateArtikelRequest
<?php
// app/Http/Requests/StoreArtikelRequest.php
namespace AppHttpRequests;
use IlluminateFoundationHttpFormRequest;
class StoreArtikelRequest extends FormRequest
{
// Siapa yang boleh akses - return true untuk semua, atau cek auth
public function authorize(): bool
{
return auth()->check();
}
// Aturan validasi
public function rules(): array
{
return [
'judul' => 'required|string|max:200',
'konten' => 'required|string|min:100',
'kategori_id' => 'required|exists:kategoris,id',
'status' => 'required|in:draft,published',
'gambar' => 'nullable|image|mimes:jpg,jpeg,png,webp|max:2048',
];
}
// Pesan error kustom
public function messages(): array
{
return [
'judul.required' => 'Judul artikel tidak boleh kosong.',
'judul.max' => 'Judul maksimal 200 karakter.',
'konten.min' => 'Konten minimal 100 karakter.',
'kategori_id.required' => 'Kategori wajib dipilih.',
'kategori_id.exists' => 'Kategori tidak valid.',
];
}
// Custom nama field untuk pesan error
public function attributes(): array
{
return [
'kategori_id' => 'kategori',
];
}
}
// Gunakan di controller - Laravel otomatis validasi sebelum method dijalankan
public function store(StoreArtikelRequest $request)
{
// Kalau sampai sini, validasi sudah pasti lolos
// $request->validated() hanya berisi field yang ada di rules()
Artikel::create($request->validated());
return redirect()->route('artikel.index')->with('success', 'Berhasil!');
}
4. Aturan Validasi Lengkap
// Keberadaan dan tipe
'required', 'nullable', 'present'
'string', 'integer', 'numeric', 'boolean', 'array'
// Ukuran
'min:n', 'max:n', 'size:n', 'between:min,max'
// Format
'email', 'url', 'ip', 'uuid', 'date', 'date_format:Y-m-d'
'alpha', 'alpha_num', 'alpha_dash'
'regex:/pattern/'
// Database
'unique:tabel,kolom'
'unique:tabel,kolom,id_kecuali' // untuk update
'exists:tabel,kolom'
// File
'file', 'image', 'mimes:jpg,png', 'mimetypes:image/jpeg'
'max:2048' // max 2MB dalam kilobytes
// Konfirmasi password
'confirmed' // perlu field nama_field_confirmation
5. Validasi Unik saat Update
// Saat update, kita perlu ignore ID record yang sedang diedit
use IlluminateValidationRule;
public function rules(): array
{
return [
'email' => [
'required',
'email',
Rule::unique('users', 'email')->ignore($this->route('user')),
],
];
}
6. Menampilkan Error di Blade
<!-- Tampilkan semua error sekaligus -->
@if($errors->any())
<div class="alert alert-danger">
<ul class="mb-0">
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<!-- Error per field -->
<input name="judul" value="{{ old('judul') }}"
class="form-control @error('judul') is-invalid @enderror">
@error('judul')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
7. Ringkasan
- Validasi cepat bisa langsung di controller dengan
$request->validate() - Form Request class lebih rapi untuk validasi yang kompleks
- Gunakan
Rule::unique()->ignore()untuk validasi unik saat update $request->validated()hanya mengembalikan field yang ada di rules
Tutorial berikutnya membahas session dan flash message di Laravel.
.jpg)
