diff --git a/src/Rules/Nullable.php b/src/Rules/Nullable.php new file mode 100644 index 0000000..7c63282 --- /dev/null +++ b/src/Rules/Nullable.php @@ -0,0 +1,21 @@ +getValue($attributeKey); $isEmptyValue = $this->isEmptyValue($value); + if ($attribute->hasRule('nullable') && $isEmptyValue) { + $rules = []; + } + $isValid = true; foreach ($rules as $ruleValidator) { $ruleValidator->setAttribute($attribute); diff --git a/src/Validator.php b/src/Validator.php index c6d3a54..1bca181 100644 --- a/src/Validator.php +++ b/src/Validator.php @@ -161,6 +161,7 @@ protected function registerBaseValidators() 'digits_between' => new Rules\DigitsBetween, 'defaults' => new Rules\Defaults, 'default' => new Rules\Defaults, // alias of defaults + 'nullable' => new Rules\Nullable, ]; foreach ($baseValidator as $key => $validator) { diff --git a/tests/ValidatorTest.php b/tests/ValidatorTest.php index 2f3b73b..4a5c5db 100644 --- a/tests/ValidatorTest.php +++ b/tests/ValidatorTest.php @@ -1494,4 +1494,44 @@ public function testRuleUploadedFileInvalidMessages() $expectedMessage = "The Sample file type must be 'jpeg', 'png', atau 'bmp'"; $this->assertEquals($validation->errors()->first('sample'), $expectedMessage); } + + public function testIgnoreNextRulesWithNullableRule() + { + $emptyFile = [ + 'name' => '', + 'type' => '', + 'size' => '', + 'tmp_name' => '', + 'error' => UPLOAD_ERR_NO_FILE + ]; + + $invalidFile = [ + 'name' => 'sample.txt', + 'type' => 'plain/text', + 'tmp_name' => __FILE__, + 'size' => 1000, + 'error' => UPLOAD_ERR_OK, + ]; + + $data1 = [ + 'file' => $emptyFile, + 'name' => '' + ]; + + $data2 = [ + 'file' => $invalidFile, + 'name' => 'a@b.c' + ]; + + $rules = [ + 'file' => 'nullable|uploaded_file:0,500K,png,jpeg', + 'name' => 'nullable|email' + ]; + + $validation1 = $this->validator->validate($data1, $rules); + $validation2 = $this->validator->validate($data2, $rules); + + $this->assertTrue($validation1->passes()); + $this->assertFalse($validation2->passes()); + } }