How to custom error messages

1.5k views Asked by At

Hi everyone and thanks for your help. I'll like to custom error messages for validation and eventually to create different version for each language, it's possible ?

Here my code in his actually state.

namespace App;

use Respect\Validation\Exceptions\ValidationException;
use Respect\Validation\Exceptions\NestedValidationException;
use Respect\Validation\Validator as v;

class Validator {

    private $messages = [
        'lastname',
        'firstname',
        'phone',
        'email',
        'message'
    ];

    //other functions and declarations of my class.

    private function validationData() {
        $rule = null;

        switch ($this->page) {
            case 'contact';
                $rule = v::key('lastname', v::notEmpty()
                                            ->alpha("-'"))
                         ->key('firstname', v::optional(v::alpha("-'")))
                         ->key('phone', v::optional(v::phone()))
                         ->key('email', v::email())
                         ->key('message', v::optional(v::length(5, 500)));
                break;
            default;
                break;
        }
        try {
            $rule->assert($this->data);
        } catch (ValidationException $exception) {
            var_dump($exception->findMessages($this->messages));
        }            
     }
 }

It returns me that:

array(5) {
["lastname"]=> string(51) "lastname must contain only letters (a-z) and ""-'"""
["firstname"]=> string(0) ""
["phone"]=> string(38) "phone must be a valid telephone number"
["email"]=> string(25) "email must be valid email"
["message"]=> string(44) "message must have a length between 5 and 500"
}

I need to keep this structure of my result of validation. Because I need field's names for could to display them at client side.

Thanks again,

1

There are 1 answers

0
Davide Pastore On BEST ANSWER

You can do it with Respect/Validation.

I'll like to custom error messages for validation

When you define your messages, just make it an associative array with the key that represents the error and the value the message that will be shown:

private $messages = [
  'lastname' => 'Error for lastname',
  'firstname' => 'Custom error for firstname',
  'phone' => 'Custom error  for phone',
  'email' => 'Custom error for email',
  'message' => 'Custom error for message'
];

and eventually to create different version for each language

You can create a custom function that converts the messages in any language you want to:

$translateMessage = function($message){
    $language = 'it'; //Retrieve your language here or use 'en' if you want your custom messages
    $messages = [
        'Key {{name}} must be present' => [
            'en' => 'Key {{name}} SHOULD be present',
            'it' => 'La chiave {{name}} deve essere presente'
        ],
        '{{name}} must be a string' => [
            'en' => '{{name}} SHOULD be a magic custom string',
            'it' => '{{name}} deve essere una stringa'
        ],
        '{{name}} must contain only letters (a-z)' => [
            'en' => '{{name}} SHOULD contain only my letters (a-z)',
            'it' => '{{name}} deve contenere solo lettere (a-z)'
        ],
        '{{name}} must contain only letters (a-z) and "{{additionalChars}}"' => [
            'en' => '{{name}} must contain only letters (a-z) and "{{additionalChars}}',
            'it' => '{{name}} deve contenere solo lettere (a-z) e "{{additionalChars}}"'
        ]
    ];
    return $messages[$message][$language];
};

and then use it in your catch block:

catch (ValidationException $exception) {
    $exception->setParam('translator', $translateMessage);
    var_dump($exception->findMessages($this->messages));
}