Skip to content

Commit 22774b2

Browse files
adam-pricketttaylorotwell
authored andcommitted
Allow getDisplayableAttribute() to be used in custom replacers (#18895)
1 parent 2c31b34 commit 22774b2

File tree

2 files changed

+49
-5
lines changed

2 files changed

+49
-5
lines changed

src/Illuminate/Validation/Concerns/FormatsMessages.php

+7-5
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ public function makeReplacements($message, $attribute, $rule, $parameters)
205205
);
206206

207207
if (isset($this->replacers[Str::snake($rule)])) {
208-
return $this->callReplacer($message, $attribute, Str::snake($rule), $parameters);
208+
return $this->callReplacer($message, $attribute, Str::snake($rule), $parameters, $this);
209209
} elseif (method_exists($this, $replacer = "replace{$rule}")) {
210210
return $this->$replacer($message, $attribute, $rule, $parameters);
211211
}
@@ -219,7 +219,7 @@ public function makeReplacements($message, $attribute, $rule, $parameters)
219219
* @param string $attribute
220220
* @return string
221221
*/
222-
protected function getDisplayableAttribute($attribute)
222+
public function getDisplayableAttribute($attribute)
223223
{
224224
$primaryAttribute = $this->getPrimaryAttribute($attribute);
225225

@@ -328,16 +328,17 @@ protected function getAttributeList(array $values)
328328
* @param string $attribute
329329
* @param string $rule
330330
* @param array $parameters
331+
* @param Illuminate\Validation\Validator $validator
331332
* @return string|null
332333
*/
333-
protected function callReplacer($message, $attribute, $rule, $parameters)
334+
protected function callReplacer($message, $attribute, $rule, $parameters, $validator)
334335
{
335336
$callback = $this->replacers[$rule];
336337

337338
if ($callback instanceof Closure) {
338339
return call_user_func_array($callback, func_get_args());
339340
} elseif (is_string($callback)) {
340-
return $this->callClassBasedReplacer($callback, $message, $attribute, $rule, $parameters);
341+
return $this->callClassBasedReplacer($callback, $message, $attribute, $rule, $parameters, $validator);
341342
}
342343
}
343344

@@ -349,9 +350,10 @@ protected function callReplacer($message, $attribute, $rule, $parameters)
349350
* @param string $attribute
350351
* @param string $rule
351352
* @param array $parameters
353+
* @param Illuminate\Validation\Validator $validator
352354
* @return string
353355
*/
354-
protected function callClassBasedReplacer($callback, $message, $attribute, $rule, $parameters)
356+
protected function callClassBasedReplacer($callback, $message, $attribute, $rule, $parameters, $validator)
355357
{
356358
list($class, $method) = Str::parseCallback($callback, 'replace');
357359

tests/Validation/ValidationValidatorTest.php

+42
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,48 @@ public function testDisplayableValuesAreReplaced()
422422
$this->assertEquals('type must be included in Short, Long.', $v->messages()->first('type'));
423423
}
424424

425+
public function testDisplayableAttributesAreReplacedInCustomReplacers()
426+
{
427+
$trans = $this->getIlluminateArrayTranslator();
428+
$trans->addLines(['validation.alliteration' => ':attribute needs to begin with the same letter as :other'], 'en');
429+
$trans->addLines(['validation.attributes.firstname' => 'Firstname'], 'en');
430+
$trans->addLines(['validation.attributes.lastname' => 'Lastname'], 'en');
431+
$v = new Validator($trans, ['firstname' => 'Bob', 'lastname' => 'Smith'], ['lastname' => 'alliteration:firstname']);
432+
$v->addExtension('alliteration', function ($attribute, $value, $parameters, $validator) {
433+
$other = array_get($validator->getData(), $parameters[0]);
434+
435+
return $value{0} == $other{0};
436+
});
437+
$v->addReplacer('alliteration', function ($message, $attribute, $rule, $parameters, $validator) {
438+
return str_replace(':other', $validator->getDisplayableAttribute($parameters[0]), $message);
439+
});
440+
$this->assertFalse($v->passes());
441+
$v->messages()->setFormat(':message');
442+
$this->assertEquals('Lastname needs to begin with the same letter as Firstname', $v->messages()->first('lastname'));
443+
444+
$trans = $this->getIlluminateArrayTranslator();
445+
$trans->addLines(['validation.alliteration' => ':attribute needs to begin with the same letter as :other'], 'en');
446+
$customAttributes = ['firstname' => 'Firstname', 'lastname' => 'Lastname'];
447+
$v = new Validator($trans, ['firstname' => 'Bob', 'lastname' => 'Smith'], ['lastname' => 'alliteration:firstname']);
448+
$v->addCustomAttributes($customAttributes);
449+
$v->addExtension('alliteration', function ($attribute, $value, $parameters, $validator) {
450+
$other = array_get($validator->getData(), $parameters[0]);
451+
452+
return $value{0} == $other{0};
453+
});
454+
$v->addReplacer('alliteration', function ($message, $attribute, $rule, $parameters, $validator) {
455+
return str_replace(':other', $validator->getDisplayableAttribute($parameters[0]), $message);
456+
});
457+
$this->assertFalse($v->passes());
458+
$v->messages()->setFormat(':message');
459+
$this->assertEquals('Lastname needs to begin with the same letter as Firstname', $v->messages()->first('lastname'));
460+
461+
$trans = $this->getIlluminateArrayTranslator();
462+
$trans->addLines(['validation.alliteration' => ':attribute needs to begin with the same letter as :other'], 'en');
463+
$customAttributes = ['firstname' => 'Firstname', 'lastname' => 'Lastname'];
464+
$v = new Validator($trans, ['firstname' => 'Bob', 'lastname' => 'Smith'], ['lastname' => 'alliteration:firstname']);
465+
}
466+
425467
public function testCustomValidationLinesAreRespected()
426468
{
427469
$trans = $this->getIlluminateArrayTranslator();

0 commit comments

Comments
 (0)