Атрибуты валидации Laravel «красивые имена»

82

Я пытаюсь использовать атрибуты проверки в "language> {language}> validation.php", чтобы заменить: имя атрибута (имя ввода) на правильное для чтения имя (пример: first_name> Имя). Это кажется очень простым в использовании, но валидатор не показывает "красивых имен".

У меня есть это:

'attributes' => array(
    'first_name' => 'voornaam'
  , 'first name' => 'voornaam'
  , 'firstname'  => 'voornaam'
);

Для отображения ошибок:

@if($errors->has())
  <ul>
  @foreach ($errors->all() as $error)
    <li class="help-inline errorColor">{{ $error }}</li>
  @endforeach
  </ul>
@endif

И проверка в контроллере:

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

Массив $ messages:

$messages = array(
    'required' => ':attribute is verplicht.'
  , 'email'    => ':attribute is geen geldig e-mail adres.'
  , 'min'      => ':attribute moet minimaal :min karakters bevatten.'
  , 'numeric'  => ':attribute mag alleen cijfers bevatten.'
  , 'url'      => ':attribute moet een valide url zijn.'
  , 'unique'   => ':attribute moet uniek zijn.'
  , 'max'      => ':attribute mag maximaal :max zijn.'
  , 'mimes'    => ':attribute moet een :mimes bestand zijn.'
  , 'numeric'  => ':attribute is geen geldig getal.'
  , 'size'     => ':attribute is te groot of bevat te veel karakters.'
);

Может кто-нибудь сказать мне, что я делаю не так. Я хочу, чтобы имя атрибута: было заменено «красивым именем» в массиве атрибутов (язык).

Благодаря!

РЕДАКТИРОВАТЬ:

Я заметил, что проблема в том, что я никогда не устанавливаю язык по умолчанию для своих проектов Laravel. Когда я устанавливаю язык на «NL», приведенный выше код работает. Но когда я устанавливаю свой язык, язык будет отображаться в URL-адресе. А я предпочитаю этого не делать.

Итак, мой следующий вопрос: можно ли удалить язык из URL-адреса или установить язык по умолчанию, чтобы он просто не отображался там?

Hak
источник
Я не уверен, правильно ли я это понимаю, но вы можете установить язык по умолчанию в app / config / app.php, который будет использоваться поставщиком услуг перевода. Для каждого языка нужно создать соответствующую папку в app / lang /. например, если у вас есть «en» и «nl» в качестве языков, которые вы используете в своем приложении, у вас должны быть обе папки в app / lang / с соответствующими файлами (в этом примере validation.php), поэтому всякий раз, когда вы меняете язык, этот файл будет загружен. Что касается удаления языка из URL-адреса, я не совсем уверен, но я считаю, что вы можете добиться этого с помощью маршрутов.
Altrim
Я знаю, как установить языки, и сейчас работает перевод имен входов. Мне только нужно знать, как удалить язык из URL. Я поищу это. Благодаря!
Hak
Однозначно это можно сделать, см. Мой ответ ниже.
Хавьер Кадис
но это для
версии

Ответы:

143

Ага, атрибуты «красивого имени», как вы это назвали, были настоящей «проблемой» несколько месяцев назад. Надеюсь, эта функция теперь реализована, и ею очень просто пользоваться.

Для простоты я разделю два варианта решения этой проблемы:

  1. Глобальный. Вероятно, более распространенный. Этот подход очень хорошо объясняется здесь, но в основном вам нужно отредактировать файл проверки application / language / XX / validation.php, где XX - это язык, который вы будете использовать для проверки.

    Внизу вы увидите массив атрибутов; это будет ваш массив атрибутов "красивого имени". Следуя вашему примеру, конечный результат будет примерно таким.

    'attributes' => array('first_name' => 'First Name')
    
  2. На местном уровне Это то, о чем Тейлор Отвелл говорил в номере, когда говорит:

    Теперь вы можете вызвать setAttributeNames в экземпляре Validator.

    Это совершенно верно, и если вы проверите исходный код, вы увидите

    public function setAttributeNames(array $attributes)
    {
        $this->customAttributes = $attributes;
    
        return $this;
    }
    

    Итак, чтобы использовать этот способ, посмотрите следующий простой пример:

    $niceNames = array(
        'first_name' => 'First Name'
    );
    
    $validator = Validator::make(Input::all(), $rules);
    $validator->setAttributeNames($niceNames); 
    

Ресурсы

На Github есть действительно классное репо есть котором есть много готовых языковых пакетов. Определенно вам стоит это проверить.

Надеюсь это поможет.

Хавьер Кадис
источник
2
Есть проблема с глобальным решением: в одной форме я мог бы иметь, 'name' => 'Customer name'а в другой - возможно 'name'=>'Seller name'. Я предпочитаю иметь переводы для каждого модуля, поэтому я могу повторно использовать эти значения также в качестве меток для полей формы. Следовательно, я голосую за локальное решение, но как тогда мне получить этот массив $ niceNames из моего языкового файла? И как мне вызвать, setAttributeNamesне создавая новый экземпляр Validator, но используя метод $ this-> validate (), который доступен в контроллерах?
JustAMartin
2
В ответ на этот комментарий и для завершения решения @javiercadiz, начиная с Laravel 5.1, вы можете использовать четвертый параметр, $this->validate(Request $request, $rules, $messages, $customAttributes)чтобы иметь эти красивые имена. См. Это в Laravel 5.1 API - запрос на подтверждение
Fran Arjona
Куда девать код в последнем варианте? Я имею в виду эту часть: $validator = Validator::make(Input::all(), $rules); $validator->setAttributeNames($niceNames);
Jenthe
Кстати, если вы используете «локально» решение, вы можете загрузить имена атрибутов из языкового файла , как это: $validator->setAttributeNames(Lang::get('my-language-file')).
orrd
31

Правильный ответ на эту конкретную проблему - перейти в папку app / lang и отредактировать файл validation.php, в нижней части файла есть массив с именем attributes :

/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/

'attributes' => array(
    'username' => 'The name of the user',
    'image_id' => 'The related image' // if it's a relation
),

Поэтому я считаю, что этот массив был создан специально для настройки этих имен атрибутов.

Логус
источник
3
Это лучший ответ для ответов на испанском языке 'attributes' => [ 'name' => 'nombre', 'mail' => 'correo', 'password' => 'contraseña', 'password2' => 'confirmación de contraseña', ],
1
Работает в Laravel 5.6
Евгений Афанасьев
27

Начиная с Laravel 5.2 вы можете ...

public function validForm(\Illuminate\Http\Request $request)
{
    $rules = [
        'first_name' => 'max:130'
    ];  
    $niceNames = [
        'first_name' => 'First Name'
    ]; 
    $this->validate($request, $rules, [], $niceNames);

    // correct validation 
ShirleyCC
источник
8

В массиве «атрибутов» ключ - это имя входа, а значение - это строка, которую вы хотите показать в сообщении.

Пример, если у вас есть такой ввод

 <input id="first-name" name="first-name" type="text" value="">

Массив (в файле validation.php) должен быть

 'attributes' => array(
    'first-name' => 'Voornaam'),

Я пробовал то же самое, и он отлично работает. Надеюсь это поможет.

РЕДАКТИРОВАТЬ

Также я заметил, что вы не передаете параметр в $errors->has() возможно, в этом проблема.

Чтобы исправить это, проверьте в контроллере, если у вас есть такой код

return Redirect::route('page')->withErrors(array('register' => $validator));

тогда вы должны передать has()методу ключ "регистрации" (или что-то еще, что вы используете), как это

@if($errors->has('register')
.... //code here
@endif

Другой способ отображения сообщений об ошибках - это следующий, который я предпочитаю (я использую Twitter Bootstrap для дизайна, но, конечно, вы можете изменить их своим собственным дизайном)

 @if (isset($errors) and count($errors->all()) > 0)
 <div class="alert alert-error">
    <h4 class="alert-heading">Problem!</h4>
     <ul>
        @foreach ($errors->all('<li>:message</li>') as $message)
         {{ $message }}
       @endforeach
    </ul>
</div>
Альтрим
источник
1
Что, если имя поля - это массив? Например, <input type="text" name="txt[]" />". Ошибка выдаст что-то вроде The txt.0 is required.. Как можно заменить его красивыми именами?
Анна Фортуна
@AnnaFortuna Проверьте этот пост, чтобы узнать, может ли он помочь вам stackoverflow.com/questions/17974231/…
Altrim
Спасибо @Altrim, проверю.
Анна Фортуна
4

В Laravel 4.1 простой способ сделать это - зайти в папку lang -> ваш язык (по умолчанию en) -> validation.php.

Если это есть в вашей модели, например:

'group_id' => 'Integer|required',
'adult_id' => 'Integer|required',

И вы не хотите, чтобы ошибка была «введите идентификатор группы», вы можете создавать «хорошие» сообщения проверки, добавляя настраиваемый массив в validation.php. Итак, в нашем примере настраиваемый массив будет выглядеть так:

'custom' => array(
    'adult_id' => array(
        'required' => 'Please choose some parents!',
    ),
    'group_id' => array(
        'required' => 'Please choose a group or choose temp!',
    ),
),

Это также работает с многоязычными приложениями, вам просто нужно отредактировать (создать) файл проверки правильности языка.

Язык по умолчанию хранится в файле конфигурации app / config / app.php и по умолчанию является английским. Это можно изменить в любое время с помощью App::setLocaleметода.

Более подробную информацию об ошибках и языках можно найти здесь Проверка и локализация .

Джон Смит
источник
2

Я использую свои пользовательские языковые файлы в качестве входных данных для таких "красивых имен" :

$validator = Validator::make(Input::all(), $rules);
$customLanguageFile = strtolower(class_basename(get_class($this)));

// translate attributes
if(Lang::has($customLanguageFile)) {
    $validator->setAttributeNames($customLanguageFile);
}
Ян Швингнешлёгль
источник
2

В Laravel 7.

use Illuminate\Support\Facades\Validator;

Затем определите niceNames

$niceNames = array(
   'name' => 'Name',
);

И последнее, просто поместите $ niceNames в четвертый параметр, например:

$validator = Validator::make($request->all(), $rules, $messages, $niceNames);
Вахю Кодар
источник
1

Атрибут: может использовать только имя атрибута (в вашем случае first_name), а не красивые имена.

Но вы можете определить собственные сообщения для каждого атрибута + проверка с помощью определенных сообщений, например:

$messages = array(
  'first_name_required' => 'Please supply your first name',
  'last_name_required' => 'Please supply your last name',
  'email_required' => 'We need to know your e-mail address!',
  'email_email' => 'Invalid e-mail address!',
);
Александр Дано
источник
1
$customAttributes = [
'email' => 'email address',
];

$validator = Validator::make($input, $rules, $messages, $customAttributes);
Талха Масуд
источник
6
Хотя этот код может предоставить решение проблемы, настоятельно рекомендуется предоставить дополнительный контекст относительно того, почему и / или как этот код отвечает на вопрос. Ответы только на код обычно становятся бесполезными в долгосрочной перспективе, потому что будущие зрители, столкнувшиеся с аналогичными проблемами, не могут понять причину решения.
Э. Зейтинчи 09
0

Что ж, это довольно старый вопрос, но мне не следует указывать на то, что проблема появления языка в URL-адресе может быть решена следующим образом:

  • Смена языка и fallback_language на config/app.php;
  • или установив \ App :: setLocale ($ lang)

Если необходимо сохранить его через сеанс, я в настоящее время использую для этого «AppServiceProvider», но я думаю, что промежуточное программное обеспечение может быть лучшим подходом, если требуется изменение языка по URL-адресу, поэтому мне нравится это у моего провайдера:

    if(!Session::has('locale'))
    {
        $locale = MyLocaleService::whatLocaleShouldIUse();
        Session::put('locale', $locale);
    }

    \App::setLocale(Session::get('locale'));

Таким образом я обрабатываю сеанс, и он не привязан к моему URL-адресу.

Чтобы уточнить, в настоящее время я использую Laravel 5.1+, но поведение не должно отличаться от 4.x;

Виктор Моура
источник