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.
NexaForm mendukung dua format validasi: Format Original dan Format Pipe.
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']
]);
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'
]);
ValidationFunction|Parameter1|Parameter2
rule1|rule2:param1,param2|rule3
NexaValidation menyediakan dua set aturan validasi:
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 |
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 |
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'
]);
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);
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
]);
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
}
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];
}
}
Berikut adalah beberapa praktik terbaik dalam validasi form:
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
]);