diff --git a/src/Illuminate/Support/Traits/Conditional.php b/src/Illuminate/Support/Traits/Conditional.php new file mode 100644 index 000000000000..0b76e65e48c1 --- /dev/null +++ b/src/Illuminate/Support/Traits/Conditional.php @@ -0,0 +1,40 @@ +when(! $value, $callback, $default); + } +} diff --git a/src/Illuminate/Validation/Rules/Dimensions.php b/src/Illuminate/Validation/Rules/Dimensions.php index e2326c7732b1..d390b8c8823b 100644 --- a/src/Illuminate/Validation/Rules/Dimensions.php +++ b/src/Illuminate/Validation/Rules/Dimensions.php @@ -2,8 +2,12 @@ namespace Illuminate\Validation\Rules; +use Illuminate\Support\Traits\Conditional; + class Dimensions { + use Conditional; + /** * The constraints for the dimensions rule. * diff --git a/src/Illuminate/Validation/Rules/Exists.php b/src/Illuminate/Validation/Rules/Exists.php index 72c378600964..59df5f3da0ee 100644 --- a/src/Illuminate/Validation/Rules/Exists.php +++ b/src/Illuminate/Validation/Rules/Exists.php @@ -2,9 +2,12 @@ namespace Illuminate\Validation\Rules; +use Illuminate\Support\Traits\Conditional; + class Exists { use DatabaseRule; + use Conditional; /** * Convert the rule to a validation string. diff --git a/src/Illuminate/Validation/Rules/Password.php b/src/Illuminate/Validation/Rules/Password.php index eddb897f43c4..a6d4e6b8c18e 100644 --- a/src/Illuminate/Validation/Rules/Password.php +++ b/src/Illuminate/Validation/Rules/Password.php @@ -8,10 +8,13 @@ use Illuminate\Contracts\Validation\UncompromisedVerifier; use Illuminate\Support\Arr; use Illuminate\Support\Facades\Validator; +use Illuminate\Support\Traits\Conditional; use InvalidArgumentException; class Password implements Rule, DataAwareRule { + use Conditional; + /** * The data under validation. * diff --git a/src/Illuminate/Validation/Rules/Unique.php b/src/Illuminate/Validation/Rules/Unique.php index 64e910240382..426c313142f6 100644 --- a/src/Illuminate/Validation/Rules/Unique.php +++ b/src/Illuminate/Validation/Rules/Unique.php @@ -3,10 +3,12 @@ namespace Illuminate\Validation\Rules; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Traits\Conditional; class Unique { use DatabaseRule; + use Conditional; /** * The ID that should be ignored. diff --git a/tests/Validation/ValidationDimensionsRuleTest.php b/tests/Validation/ValidationDimensionsRuleTest.php index 469d060e9bd8..29d518a16081 100644 --- a/tests/Validation/ValidationDimensionsRuleTest.php +++ b/tests/Validation/ValidationDimensionsRuleTest.php @@ -29,5 +29,14 @@ public function testItCorrectlyFormatsAStringVersionOfTheRule() $rule = Rule::dimensions()->minWidth(300)->minHeight(400); $this->assertSame('dimensions:min_width=300,min_height=400', (string) $rule); + + $rule = Rule::dimensions() + ->when(true, function ($rule) { + $rule->height('100'); + }) + ->unless(true, function ($rule) { + $rule->width('200'); + }); + $this->assertSame('dimensions:height=100', (string) $rule); } } diff --git a/tests/Validation/ValidationExistsRuleTest.php b/tests/Validation/ValidationExistsRuleTest.php index e0039d6c6cfd..77918ce3992a 100644 --- a/tests/Validation/ValidationExistsRuleTest.php +++ b/tests/Validation/ValidationExistsRuleTest.php @@ -116,6 +116,35 @@ public function testItChoosesValidRecordsUsingWhereNotInRule() $this->assertTrue($v->passes()); } + public function testItChoosesValidRecordsUsingConditionalModifiers() + { + $rule = new Exists('users', 'id'); + $rule->when(true, function ($rule) { + $rule->whereNotIn('type', ['foo', 'bar']); + }); + $rule->unless(true, function ($rule) { + $rule->whereNotIn('type', ['baz', 'other']); + }); + + User::create(['id' => '1', 'type' => 'foo']); + User::create(['id' => '2', 'type' => 'bar']); + User::create(['id' => '3', 'type' => 'baz']); + User::create(['id' => '4', 'type' => 'other']); + + $trans = $this->getIlluminateArrayTranslator(); + $v = new Validator($trans, [], ['id' => $rule]); + $v->setPresenceVerifier(new DatabasePresenceVerifier(Eloquent::getConnectionResolver())); + + $v->setData(['id' => 1]); + $this->assertFalse($v->passes()); + $v->setData(['id' => 2]); + $this->assertFalse($v->passes()); + $v->setData(['id' => 3]); + $this->assertTrue($v->passes()); + $v->setData(['id' => 4]); + $this->assertTrue($v->passes()); + } + public function testItChoosesValidRecordsUsingWhereNotInAndWhereNotInRulesTogether() { $rule = new Exists('users', 'id'); diff --git a/tests/Validation/ValidationPasswordRuleTest.php b/tests/Validation/ValidationPasswordRuleTest.php index 5d16de98f224..d484226e2d57 100644 --- a/tests/Validation/ValidationPasswordRuleTest.php +++ b/tests/Validation/ValidationPasswordRuleTest.php @@ -41,6 +41,25 @@ public function testMin() $this->passes(new Password(8), ['88888888']); } + public function testConditional() + { + $is_privileged_user = true; + $rule = (new Password(8))->when($is_privileged_user, function ($rule) { + $rule->symbols(); + }); + + $this->fails($rule, ['aaaaaaaa', '11111111'], [ + 'The my password must contain at least one symbol.', + ]); + + $is_privileged_user = false; + $rule = (new Password(8))->when($is_privileged_user, function ($rule) { + $rule->symbols(); + }); + + $this->passes($rule, ['aaaaaaaa', '11111111']); + } + public function testMixedCase() { $this->fails(Password::min(2)->mixedCase(), ['nn', 'MM'], [ diff --git a/tests/Validation/ValidationUniqueRuleTest.php b/tests/Validation/ValidationUniqueRuleTest.php index c967ab7c077c..c1545887db02 100644 --- a/tests/Validation/ValidationUniqueRuleTest.php +++ b/tests/Validation/ValidationUniqueRuleTest.php @@ -40,6 +40,16 @@ public function testItCorrectlyFormatsAStringVersionOfTheRule() $rule->where('foo', 'bar'); $this->assertSame('unique:table,column,"Taylor, Otwell",id_column,foo,"bar"', (string) $rule); + $rule = new Unique(EloquentModelStub::class, 'column'); + $rule->where('foo', 'bar'); + $rule->when(true, function ($rule) { + $rule->ignore('Taylor, Otwell', 'id_column'); + }); + $rule->unless(true, function ($rule) { + $rule->ignore('Chris', 'id_column'); + }); + $this->assertSame('unique:table,column,"Taylor, Otwell",id_column,foo,"bar"', (string) $rule); + $rule = new Unique('table', 'column'); $rule->ignore('Taylor, Otwell"\'..-"', 'id_column'); $rule->where('foo', 'bar');