Отображать сообщение об ошибке для пользовательской проверки в Laravel 4

Я создал специальную функцию ошибок, создав класс;

<?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;
    }
}

Я ссылаюсь на это в своей модели;

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'
    );

Он был зарегистрирован в моем global.php;

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

Все работает хорошо, но возвращается сообщение об ошибке:

validation.postcode

Как / где мне установить для этого пользовательское сообщение об ошибке?
Я пробовал установить app / lang / en / validation.php с помощью (ни одна из них не работает);

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

P.S. Я знаю, что уже существует метод проверки регулярных выражений, но эта проблема для меня более общая.


person Rooneyl    schedule 15.08.2013    source источник
comment
@AbishekRSrikaanth, этот ответ предназначен для настраиваемых заполнителей в сообщениях об ошибках, а не для фактического сообщения настраиваемого метода   -  person Rooneyl    schedule 16.08.2013


Ответы (6)


Думаю, я раскололся.

Я добавил сообщение в основной массив в app / lang / en / validation.php, а не в настраиваемый подмассив.

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

Если это неправильный способ, тогда кто-нибудь может меня поправить.

person Rooneyl    schedule 15.08.2013
comment
Я сделал то же самое и считаю, что это правильный способ. - person Alexander Taubenkorb; 07.09.2013
comment
Я очень хотел бы знать, правильно ли это тоже, это кажется отрывочным. - person Sturm; 20.12.2013
comment
@ uɐɥʇɐᴎ У меня была такая же проблема - см. мой опубликованный ответ о том, как правильно использовать настраиваемый массив проверки. - person Jon; 30.06.2014
comment
Это все еще не работает для меня со сторонним пользовательским правилом :-( github.com/felixkiss/uniquewith -валидатор - person groovenectar; 29.07.2014
comment
Файл находится в немного другом месте в версии 5: github.com/laravel/laravel/blob/master/resources/lang/en/ - person Juddling; 23.07.2015
comment
В laravel 5.1 этот файл расположен по адресу resources/lang/en/validation.php - person Sagar Naliyapara; 02.08.2016

Вы можете использовать метод setCustomMessages() для назначения пользовательских сообщений, таких как приведенный ниже код

<?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
    }

}
person l3ehnam    schedule 10.09.2014

может быть, этот код лучше:

// 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);
person antoniputra    schedule 07.03.2014
comment
если вы занимаетесь разработкой пакетов, это единственный хороший вариант. \ Lang :: get ('package :: validation.custom'); - person Artistan; 20.03.2014

Из документации:

В некоторых случаях вы можете указать свои собственные сообщения в языковом файле вместо того, чтобы передавать их непосредственно валидатору. Для этого добавьте свои сообщения в настраиваемый массив в языковом файле app / lang / xx / validation.php.

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

Это означает, что в вашем случае

'custom' => array(
    'postcode' => array(
        'PostCode' => 'error message for PostCode rule',
        'required' => 'error message for required rule',
    ),
),
person brazorf    schedule 18.05.2014

Если вы хотите использовать настраиваемый массив сообщений проверки в app / lang / xx / validation.php, правильный способ выглядит следующим образом:

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

Обратите внимание, что вы используете имя поля формы, а затем в массиве вы используете имя правила в нижнем регистре.

person Jon    schedule 30.06.2014
comment
Если вы хотите сохранить свои $ messages с правилами $, вы также можете иметь в своей модели просто следующее (чтобы не связываться с языковыми файлами): public static $messages = array ( 'formFieldName.postcode' => 'error message for PostCode rule' ); - person Jon; 30.06.2014
comment
Это все еще не работает для меня со сторонним пользовательским правилом :-( github.com/felixkiss/uniquewith -валидатор - person groovenectar; 29.07.2014
comment
@groovenectar Я не могу просмотреть ваш код, но могу определенно сказать, что это работает, и я использую его в течение некоторого времени. - person Jon; 30.07.2014

Приведенный ниже код также отлично работает, обратите внимание на подчеркивание в индексе массива $customValidatorMessages. Надеюсь, это кому-то поможет :-)

class CoreValidator extends Illuminate\Validation\Validator
{
    /**
     * The array of custom validator error messages.
     *
     * @var array
     */
    protected $customValidatorMessages = array(); 

    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;
        }

        $this->customValidatorMessages['post_code'] = 'Postcode error message.';

        $this->setCustomMessages($this->customValidatorMessages);

        return false;
    }
}
person Mushangi Derrick    schedule 19.03.2015