Skip to content

Commit 64cfc65

Browse files
themsaidtaylorotwell
authored andcommitted
[5.4] Allow adding dependent extensions to the Vallidator (#18654)
* Allow adding dependent extensions to repository * fix style
1 parent 9d33533 commit 64cfc65

File tree

4 files changed

+75
-3
lines changed

4 files changed

+75
-3
lines changed

src/Illuminate/Validation/Factory.php

+26
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,13 @@ class Factory implements FactoryContract
4545
*/
4646
protected $implicitExtensions = [];
4747

48+
/**
49+
* All of the custom dependent validator extensions.
50+
*
51+
* @var array
52+
*/
53+
protected $dependentExtensions = [];
54+
4855
/**
4956
* All of the custom validator message replacers.
5057
*
@@ -162,6 +169,8 @@ protected function addExtensions(Validator $validator)
162169
// array of data that is given to a validator instances via instantiation.
163170
$validator->addImplicitExtensions($this->implicitExtensions);
164171

172+
$validator->addDependentExtensions($this->dependentExtensions);
173+
165174
$validator->addReplacers($this->replacers);
166175

167176
$validator->setFallbackMessages($this->fallbackMessages);
@@ -201,6 +210,23 @@ public function extendImplicit($rule, $extension, $message = null)
201210
}
202211
}
203212

213+
/**
214+
* Register a custom implicit validator extension.
215+
*
216+
* @param string $rule
217+
* @param \Closure|string $extension
218+
* @param string $message
219+
* @return void
220+
*/
221+
public function extendDependent($rule, $extension, $message = null)
222+
{
223+
$this->dependentExtensions[$rule] = $extension;
224+
225+
if ($message) {
226+
$this->fallbackMessages[Str::snake($rule)] = $message;
227+
}
228+
}
229+
204230
/**
205231
* Register a custom implicit validator message replacer.
206232
*

src/Illuminate/Validation/Validator.php

+29
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,21 @@ public function addImplicitExtensions(array $extensions)
812812
}
813813
}
814814

815+
/**
816+
* Register an array of custom implicit validator extensions.
817+
*
818+
* @param array $extensions
819+
* @return void
820+
*/
821+
public function addDependentExtensions(array $extensions)
822+
{
823+
$this->addExtensions($extensions);
824+
825+
foreach ($extensions as $rule => $extension) {
826+
$this->dependentRules[] = Str::studly($rule);
827+
}
828+
}
829+
815830
/**
816831
* Register a custom validator extension.
817832
*
@@ -838,6 +853,20 @@ public function addImplicitExtension($rule, $extension)
838853
$this->implicitRules[] = Str::studly($rule);
839854
}
840855

856+
/**
857+
* Register a custom dependent validator extension.
858+
*
859+
* @param string $rule
860+
* @param \Closure|string $extension
861+
* @return void
862+
*/
863+
public function addDependentExtension($rule, $extension)
864+
{
865+
$this->addExtension($rule, $extension);
866+
867+
$this->dependentRules[] = Str::studly($rule);
868+
}
869+
841870
/**
842871
* Register an array of custom validator message replacers.
843872
*

tests/Validation/ValidationFactoryTest.php

+5-3
Original file line numberDiff line numberDiff line change
@@ -34,20 +34,22 @@ public function testMakeMethodCreatesValidValidator()
3434
};
3535
$factory->extend('foo', $noop1);
3636
$factory->extendImplicit('implicit', $noop2);
37+
$factory->extendDependent('dependent', $noop3);
3738
$factory->replacer('replacer', $noop3);
3839
$factory->setPresenceVerifier($presence);
3940
$validator = $factory->make([], []);
40-
$this->assertEquals(['foo' => $noop1, 'implicit' => $noop2], $validator->extensions);
41+
$this->assertEquals(['foo' => $noop1, 'implicit' => $noop2, 'dependent' => $noop3], $validator->extensions);
4142
$this->assertEquals(['replacer' => $noop3], $validator->replacers);
4243
$this->assertEquals($presence, $validator->getPresenceVerifier());
4344

4445
$presence = m::mock(PresenceVerifierInterface::class);
4546
$factory->extend('foo', $noop1, 'foo!');
4647
$factory->extendImplicit('implicit', $noop2, 'implicit!');
48+
$factory->extendImplicit('dependent', $noop3, 'dependent!');
4749
$factory->setPresenceVerifier($presence);
4850
$validator = $factory->make([], []);
49-
$this->assertEquals(['foo' => $noop1, 'implicit' => $noop2], $validator->extensions);
50-
$this->assertEquals(['foo' => 'foo!', 'implicit' => 'implicit!'], $validator->fallbackMessages);
51+
$this->assertEquals(['foo' => $noop1, 'implicit' => $noop2, 'dependent' => $noop3], $validator->extensions);
52+
$this->assertEquals(['foo' => 'foo!', 'implicit' => 'implicit!', 'dependent' => 'dependent!'], $validator->fallbackMessages);
5153
$this->assertEquals($presence, $validator->getPresenceVerifier());
5254
}
5355

tests/Validation/ValidationValidatorTest.php

+15
Original file line numberDiff line numberDiff line change
@@ -2518,6 +2518,21 @@ public function testCustomImplicitValidators()
25182518
$this->assertTrue($v->passes());
25192519
}
25202520

2521+
public function testCustomDependentValidators()
2522+
{
2523+
$trans = $this->getIlluminateArrayTranslator();
2524+
$v = new Validator($trans,
2525+
[
2526+
['name' => 'Jamie', 'age' => 27],
2527+
],
2528+
['*.name' => 'dependent_rule:*.age']
2529+
);
2530+
$v->addDependentExtension('dependent_rule', function ($name) use ($v) {
2531+
return array_get($v->getData(), $name) == 'Jamie';
2532+
});
2533+
$this->assertTrue($v->passes());
2534+
}
2535+
25212536
/**
25222537
* @expectedException InvalidArgumentException
25232538
*/

0 commit comments

Comments
 (0)