Form Validation

Pengenalan Validasi Form

Validasi form adalah proses memeriksa input user untuk memastikan data yang dikirimkan sesuai dengan kriteria yang diharapkan. NexaForm menyediakan sistem validasi yang komprehensif dan mudah digunakan melalui trait NexaValidation.

Format Aturan Validasi

NexaForm mendukung dua format validasi: Format Original dan Format Pipe.

1. Format Original

Format original menggunakan pola "ValidationFunction|Parameter1|Parameter2":


// Format string: "ValidationFunction|Parameter1|Parameter2"
$form->fields([
    'username' => 'Name|3|Username harus minimal 3 karakter',
    'email' => 'Email',
    'age' => 'Number|18|Umur harus minimal 18 tahun',
    'website' => 'Url',
    'profile_image' => 'File|jpg,png,gif|Foto profil maksimal 2MB'
]);

// Atau menggunakan array
$form->fields([
    'username' => ['Name', '3', 'Username harus minimal 3 karakter'],
    'email' => ['Email'],
    'age' => ['Number', '18', 'Umur harus minimal 18 tahun']
]);
        

2. Format Pipe

Format pipe menggunakan pola "rule1|rule2:param1,param2|rule3":


// Format pipe dengan multiple rules
$form->fields([
    'username' => 'required|min:3|max:20|alphaNum',
    'age' => 'required|numeric|min:18|max:100',
    'status' => 'required|in:active,inactive,pending',
    'email' => 'required|email',
    'description' => 'required|min:10|max:1000'
]);
        
Catatan Format:
  • Format Original: ValidationFunction|Parameter1|Parameter2
    • ValidationFunction: Nama fungsi validasi (Name, Email, Number)
    • Parameter1: Parameter pertama (min_length atau allowed_types)
    • Parameter2: Pesan error kustom (opsional)
  • Format Pipe: rule1|rule2:param1,param2|rule3
    • Multiple rules dipisahkan dengan pipe (|)
    • Parameter dipisahkan dengan titik dua (:)
    • Multiple parameter dipisahkan dengan koma (,)

Aturan Validasi yang Tersedia

NexaValidation menyediakan dua set aturan validasi:

A. Aturan Format Original

Aturan Parameter Deskripsi
Required - Field harus diisi
Name min_length, max_length Validasi nama dengan panjang minimum dan maksimum
Email - Field harus berupa email valid
Url - Field harus berupa URL valid
Number min_value, max_value Field harus berupa angka dalam rentang tertentu
Integer min_value, max_value Field harus berupa bilangan bulat dalam rentang tertentu
Float min_value, max_value Field harus berupa bilangan desimal dalam rentang tertentu
Alpha min_length, max_length Field hanya boleh berisi huruf
Alphanumeric min_length, max_length Field hanya boleh berisi huruf dan angka
Password min_length Validasi password dengan panjang minimum
PasswordConfirm min_length Konfirmasi password harus sama dengan field password
Select - Field select harus dipilih (tidak kosong)
Textarea min_length, max_length Validasi textarea dengan panjang minimum dan maksimum
Date format Field harus berupa tanggal valid
File allowed_types, max_size Field harus berupa file yang diupload dengan tipe dan ukuran yang valid
FileOptional allowed_types, max_size Field boleh kosong atau berupa file yang diupload dengan tipe dan ukuran yang valid
Json - Field harus berupa JSON valid

B. Aturan Format Pipe

Aturan Parameter Deskripsi
required - Field harus diisi (tidak boleh kosong)
min number Minimum panjang string atau nilai minimum untuk angka
max number Maximum panjang string atau nilai maximum untuk angka
numeric - Field harus berupa angka
alpha - Field hanya boleh berisi huruf
alphaNum - Field hanya boleh berisi huruf dan angka
in value1,value2,... Field harus berisi salah satu dari nilai yang ditentukan

Custom Validation Messages

Anda dapat menyesuaikan pesan error validasi dengan menambahkan parameter terakhir:


$form->fields([
    'username' => 'Name|3|Username wajib diisi dan minimal 3 karakter',
    'email' => 'Email',
    'password' => 'Password|8|Password minimal 8 karakter',
    'confirm_password' => 'PasswordConfirm|8|Konfirmasi password tidak sesuai'
]);
        

Validasi Kondisional

Anda dapat melakukan validasi kondisional berdasarkan nilai field lain:


// Validasi field shipping_address hanya jika different_shipping_address = 1
$validationRules = [
    'name' => 'Name|3|Nama wajib diisi',
    'email' => 'Email'
];

if ($this->getPost('different_shipping_address') == '1') {
    $validationRules['shipping_address'] = 'Textarea|10|Alamat pengiriman wajib diisi';
}

$form->fields($validationRules);
        

Validasi File Upload

Untuk validasi file upload, gunakan aturan File atau FileOptional:


$form->fields([
    'profile_image' => 'File|jpg,png,gif|2048|Foto profil maksimal 2MB',  // File gambar wajib, maks 2MB
    'resume' => 'FileOptional|pdf,doc,docx|5120|File resume maksimal 5MB'  // File opsional, hanya PDF/DOC/DOCX, maks 5MB
])
->setUpload([
    'dir' => 'uploads/profiles',
    'allowed_types' => ['jpg', 'png', 'gif', 'pdf', 'doc', 'docx'],
    'max_size' => 5120,  // 5MB
    'encrypt_name' => true
]);
        

Menangani Hasil Validasi

Hasil validasi dapat diakses dari return value method process():


$result = $form->process();

if ($result['success']) {
    // Validasi berhasil
    $validData = $result['data'];
    // Proses data
} else {
    // Validasi gagal
    $errors = $result['errors'];
    // Tampilkan error
}
        

Validasi Manual

Anda juga dapat melakukan validasi manual tanpa memproses seluruh form:


$form = $this->createForm();

// Set aturan validasi
$form->fields([
    'email' => 'Email|Alamat email tidak valid',
    'password' => 'Password|8|Password minimal 8 karakter'
]);

// Validasi field tertentu
$emailValue = $_POST['email'] ?? '';
$passwordValue = $_POST['password'] ?? '';

$emailResult = $form->validateField('email', $emailValue);
$passwordResult = $form->validateField('password', $passwordValue);

if ($emailResult[0] && $passwordResult[0]) {
    // Semua validasi berhasil
} else {
    // Ada validasi yang gagal
    if (!$emailResult[0]) {
        echo "Email error: " . $emailResult[1];
    }
    if (!$passwordResult[0]) {
        echo "Password error: " . $passwordResult[1];
    }
}
        

Best Practices

Berikut adalah beberapa praktik terbaik dalam validasi form:

  • Selalu validasi input user di server-side, meskipun sudah ada validasi client-side
  • Gunakan aturan validasi yang spesifik untuk setiap jenis data
  • Berikan pesan error yang jelas dan informatif
  • Validasi file upload dengan ketat untuk mencegah serangan
  • Gunakan validasi kondisional untuk form yang kompleks
  • Sanitize data setelah validasi sebelum menyimpan ke database

Contoh Penggunaan Kombinasi Format

Anda dapat menggunakan kedua format validasi dalam satu form:


$form = NexaForm::createForm()
    ->fields([
        // Format Original - untuk fitur spesifik
        'password' => 'password|8|Password minimal 8 karakter',
        'confirm_password' => 'passwordConfirm',
        'document' => 'file',
        'optional_image' => 'fileOptional',
        'json_config' => 'json',
        
        // Format Pipe - untuk validasi umum
        'username' => 'required|min:3|max:20|alphaNum',
        'email' => 'required|email',
        'age' => 'required|numeric|min:18',
        'role' => 'required|in:admin,user,editor'
    ])
    ->setUpload([
        'path' => 'uploads/',
        'allowed_types' => ['jpg', 'pdf'],
        'max_size' => 2048
    ]);
        
Rekomendasi Penggunaan:
  • Gunakan Format Original untuk fitur spesifik (password, file upload, JSON, dll)
  • Gunakan Format Pipe untuk validasi umum (panjang, angka, pilihan, dll)
  • Jangan mencampur kedua format dalam satu rule
  • Pilih format yang paling sesuai untuk setiap kasus penggunaan