Display Error Message for Custom Validation in Laravel 4

11,251

Solution 1

I think I have cracked it.

I added the message to the main array in app/lang/en/validation.php, not into the custom sub-array.

return array(
    ...
    "url" => "The :attribute format is invalid.",
    "postcode" => "my error message 2",
    ...
)

If this isn't the correct way, then someone is free to correct me.

Solution 2

You can use setCustomMessages() method to assign custom messages like the bellow code

<?php

class CoreValidator extends Illuminate\Validation\Validator
{

    private $custom_messages = array(
        "customvalidation" => "my error message.",
    );

    public function __construct($translator, $data, $rules, $messages = array(), $customAttributes = array())
    {
        parent::__construct($translator, $data, $rules, $messages, $customAttributes);
        $this->setCustomMessages($this->custom_messages);
    }

    public function validateCustomvalidation($attribute, $value, $parameters = null)
    {
        // validation code here
    }

}

Solution 3

maybe this code more better :

// for example I am using sub-array custom at default validation file, but you can do it in other file as you wishes.
..other..
'custom' => array(
        'email' => array(
            'required' => 'We need to know your e-mail address!',
        ),
        "required"         => "Hey!!! don't forget at :attribute field is required.",
    ),
..other..

// you can determine your custom languages at your wishes file
$messages = \Lang::get('validation.custom');

Validator::make($input, $rules, $messages);

Solution 4

From documentation:

In some cases, you may wish to specify your custom messages in a language file instead of passing them directly to the Validator. To do so, add your messages to custom array in the app/lang/xx/validation.php language file.

'custom' => array(
    'email' => array(
        'required' => 'We need to know your e-mail address!',
    ),
),

That means, in your case,

'custom' => array(
    'postcode' => array(
        'PostCode' => 'error message for PostCode rule',
        'required' => 'error message for required rule',
    ),
),

Solution 5

If you want to utilize the custom validation messages array in app/lang/xx/validation.php, the correct way is as follows:

'custom' => array(
    'formFieldName' => array(
        'postcode' => 'error message for PostCode rule',
        'iamalwayslowercase' => 'error message for this rule'
    ),
),

Note that you use the name of the form field and then in the array you use the lowercased name of the rule.

Share:
11,251
Rooneyl
Author by

Rooneyl

Code monkey

Updated on June 04, 2022

Comments

  • Rooneyl
    Rooneyl almost 2 years

    I have created a custom error function by creating a class;

    <?php
    
    class CoreValidator extends Illuminate\Validation\Validator
    {
        public function validatePostcode($attribute, $value, $parameters = null)
        {
            $regex = "/^((GIR 0AA)|((([A-PR-UWYZ][0-9][0-9]?)|(([A-PR-UWYZ][A-HK-Y][0-9][0-9]?)|(([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY])))) [0-9][ABD-HJLNP-UW-Z]{2}))$/i";
            if(preg_match($regex ,$value)) {
                return true;
            }
            return false;
        }
    }
    

    I reference it in my model;

    public static $rules = array(
            'first_name' => 'required|Max:45',
            'surname' => 'required|Max:45',
            'address_line_1' => 'required|Max:255',
            'address_line_2' => 'Max:255',
            'address_line_3' => 'Max:255',
            'town' => 'required|Max:45',
            'county' => 'Max:45',
            'postcode' => 'required|Postcode',
            'phone_number' => 'required|Max:22'
        );
    

    It has been registered in my global.php;

    Validator::resolver(function($translator, $data, $rules, $messages) {
            return new CoreValidator($translator, $data, $rules, $messages);
        });
    

    It all works well, but the error message it returns is

    validation.postcode

    How/where do I set a custom error message for this?
    I have tried setting app/lang/en/validation.php with (neither work);

    'custom' => array(
            "validation.postcode" => "my error message 1",
            "postcode" => "my error message 2"
        )
    

    P.S. I know that there is a regex validation method already, but this problem is more generic for me.

  • Alexander Taubenkorb
    Alexander Taubenkorb over 10 years
    I did it the same way and think also this is the correct way.
  • Sturm
    Sturm over 10 years
    I'd very much like to know if that's correct also, it seems sketchy.
  • Artistan
    Artistan about 10 years
    if you are doing package development, this is the only good option. \Lang::get('package::validation.custom');
  • Jon
    Jon almost 10 years
    @uɐɥʇɐᴎ I just had this same issue - see my posted answer on how to correctly utilize the custom validation array.
  • Jon
    Jon almost 10 years
    If you wanted to keep your $messages with the $rules, you could also just have the following in your model (so you don't mess with the language files): public static $messages = array ( 'formFieldName.postcode' => 'error message for PostCode rule' );
  • groovenectar
    groovenectar almost 10 years
    This still doesn't work for me with a 3rd party custom rule :-( github.com/felixkiss/uniquewith-validator
  • groovenectar
    groovenectar almost 10 years
    This still doesn't work for me with a 3rd party custom rule :-( github.com/felixkiss/uniquewith-validator
  • Jon
    Jon almost 10 years
    @groovenectar I am unable to review your code, but I can definitely say the above works and have been using it for some time.
  • Juddling
    Juddling almost 9 years
    File is in a slightly different place in v5: github.com/laravel/laravel/blob/master/resources/lang/en/…
  • Sagar Naliyapara
    Sagar Naliyapara almost 8 years
    In laravel 5.1 this file located at resources/lang/en/validation.php