From f825c5e11bebba221117188866e088ead7cc864c Mon Sep 17 00:00:00 2001 From: Samuel Levy Date: Mon, 16 Aug 2021 20:40:55 +1000 Subject: [PATCH 1/3] Added `prohibits` validation --- .../Concerns/ReplacesAttributes.php | 14 +++++++ .../Concerns/ValidatesAttributes.php | 19 +++++++++ tests/Validation/ValidationValidatorTest.php | 41 +++++++++++++++++++ 3 files changed, 74 insertions(+) diff --git a/src/Illuminate/Validation/Concerns/ReplacesAttributes.php b/src/Illuminate/Validation/Concerns/ReplacesAttributes.php index 29ffaacd4175..6e30c19b00a9 100644 --- a/src/Illuminate/Validation/Concerns/ReplacesAttributes.php +++ b/src/Illuminate/Validation/Concerns/ReplacesAttributes.php @@ -432,6 +432,20 @@ protected function replaceProhibitedUnless($message, $attribute, $rule, $paramet return str_replace([':other', ':values'], [$other, implode(', ', $values)], $message); } + /** + * Replace all place-holders for the prohibited_with rule. + * + * @param string $message + * @param string $attribute + * @param string $rule + * @param array $parameters + * @return string + */ + protected function replaceProhibits($message, $attribute, $rule, $parameters) + { + return str_replace(':other', implode(' / ', $this->getAttributeList($parameters)), $message); + } + /** * Replace all place-holders for the same rule. * diff --git a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php index dca3b45b47ba..8a728cdbf90c 100644 --- a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php +++ b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php @@ -1534,6 +1534,25 @@ public function validateProhibitedUnless($attribute, $value, $parameters) return true; } + /** + * Validate that other attributes do not exist when this attribute exists. + * + * @param string $attribute + * @param mixed $value + * @param mixed $parameters + * @return bool + */ + public function validateProhibits($attribute, $value, $parameters) + { + foreach ($parameters as $other) { + if (Arr::has($this->data, $other)) { + return false; + } + } + + return true; + } + /** * Indicate that an attribute is excluded. * diff --git a/tests/Validation/ValidationValidatorTest.php b/tests/Validation/ValidationValidatorTest.php index 3253ac5b386f..42ba9bdeaa7b 100755 --- a/tests/Validation/ValidationValidatorTest.php +++ b/tests/Validation/ValidationValidatorTest.php @@ -1470,6 +1470,47 @@ public function testProhibitedUnless() $this->assertSame('The last field is prohibited unless first is in taylor, jess.', $v->messages()->first('last')); } + public function testProhibits() + { + $trans = $this->getIlluminateArrayTranslator(); + $v = new Validator($trans, ['email' => 'foo', 'emails' => ['foo']], ['email' => 'prohibits:emails']); + $this->assertTrue($v->fails()); + + $trans = $this->getIlluminateArrayTranslator(); + $v = new Validator($trans, ['email' => 'foo', 'emails' => []], ['email' => 'prohibits:emails']); + $this->assertTrue($v->fails()); + + $trans = $this->getIlluminateArrayTranslator(); + $v = new Validator($trans, ['email' => 'foo', 'emails' => ''], ['email' => 'prohibits:emails']); + $this->assertTrue($v->fails()); + + $trans = $this->getIlluminateArrayTranslator(); + $v = new Validator($trans, ['email' => 'foo', 'emails' => null], ['email' => 'prohibits:emails']); + $this->assertTrue($v->fails()); + + $trans = $this->getIlluminateArrayTranslator(); + $v = new Validator($trans, ['email' => 'foo', 'emails' => false], ['email' => 'prohibits:emails']); + $this->assertTrue($v->fails()); + + $trans = $this->getIlluminateArrayTranslator(); + $v = new Validator($trans, ['email' => 'foo', 'emails' => ['foo']], ['email' => 'prohibits:email_address,emails']); + $this->assertTrue($v->fails()); + + $trans = $this->getIlluminateArrayTranslator(); + $v = new Validator($trans, ['email' => 'foo'], ['email' => 'prohibits:emails']); + $this->assertTrue($v->passes()); + + $trans = $this->getIlluminateArrayTranslator(); + $v = new Validator($trans, ['email' => 'foo', 'other' => 'foo'], ['email' => 'prohibits:email_address,emails']); + $this->assertTrue($v->passes()); + + $trans = $this->getIlluminateArrayTranslator(); + $trans->addLines(['validation.prohibits' => 'The :attribute field prohibits :other being present.'], 'en'); + $v = new Validator($trans, ['email' => 'foo', 'emails' => 'bar', 'email_address' => 'baz'], ['email' => 'prohibits:emails,email_address']); + $this->assertFalse($v->passes()); + $this->assertSame('The email field prohibits emails / email address being present.', $v->messages()->first('email')); + } + public function testFailedFileUploads() { $trans = $this->getIlluminateArrayTranslator(); From 9644a5f849ede2820e0c597e081188c50f34ad9d Mon Sep 17 00:00:00 2001 From: Samuel Levy Date: Tue, 31 Aug 2021 20:42:45 +1000 Subject: [PATCH 2/3] Update src/Illuminate/Validation/Concerns/ValidatesAttributes.php Co-authored-by: Julius Kiekbusch --- .../Validation/Concerns/ValidatesAttributes.php | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php index 8a728cdbf90c..78574001722c 100644 --- a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php +++ b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php @@ -1544,13 +1544,7 @@ public function validateProhibitedUnless($attribute, $value, $parameters) */ public function validateProhibits($attribute, $value, $parameters) { - foreach ($parameters as $other) { - if (Arr::has($this->data, $other)) { - return false; - } - } - - return true; + return !Arr::hasAny($this->data, $parameters); } /** From 16ab1829cb4f09b74a39f02aa6ccdb95246bdc1d Mon Sep 17 00:00:00 2001 From: Samuel Levy Date: Tue, 31 Aug 2021 20:44:17 +1000 Subject: [PATCH 3/3] Style CI Fix --- src/Illuminate/Validation/Concerns/ValidatesAttributes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php index 78574001722c..af57fd648993 100644 --- a/src/Illuminate/Validation/Concerns/ValidatesAttributes.php +++ b/src/Illuminate/Validation/Concerns/ValidatesAttributes.php @@ -1544,7 +1544,7 @@ public function validateProhibitedUnless($attribute, $value, $parameters) */ public function validateProhibits($attribute, $value, $parameters) { - return !Arr::hasAny($this->data, $parameters); + return ! Arr::hasAny($this->data, $parameters); } /**