Laravel Extended Validation custom message Laravel Extended Validation custom message php php

Laravel Extended Validation custom message


The extend method allows to pass the message as a third argument:

Validator::extend('my_custom_validation_rule', function ($attribute, $value, $parameters) {    // ...}, 'my custom validation rule message');

By default you can only use dynamic variable, which is :attribute. If you want to add more use Validator::replacer():

Validator::replacer('my_custom_validation_rule', function($message, $attribute, $rule, $parameters){    return str_replace(':foo', $parameters[0], $message);});


You can also define the message for your custom validation rule under validation translations file.

/resources/lang/en/validation.php

....'unique'                    => 'The :attribute has already been taken.','uploaded'                  => 'The :attribute failed to upload.','url'                       => 'The :attribute format is invalid.',//place your translation here'my_custom_validation_rule' => 'The :attribute value fails custom validation.'


This is basically the same way as @lukasgeiter answer, but in case you need to manage dynamic variable inside the extend function, you can use $validator->addReplacer inside the extend directly.

Validator::extend('my_custom_validation_rule', function ($attribute, $value, $parameters, $validator) {    // Test custom message    $customMessage = request()->get('foo')         ? "Foo doesn't exist"        : "Foo exist";    // Replace dynamic variable :custom_message with $customMessage    $validator->addReplacer('my_custom_validation_rule',         function($message, $attribute, $rule, $parameters) use ($customMessage) {            return \str_replace(':custom_message', $customMessage, $message);        }    );    // Test error message. (Make it always fail the validator)    return false;}, 'My custom validation rule message. :custom_message');