Атрибуты проверки Laravel "хорошие имена"

Я пытаюсь использовать атрибуты проверки в "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.'
);

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

Спасибо!

EDIT:

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

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

Ответ 1

Yeahh, атрибуты "nice name", которые вы назвали, были реальным "вопросом" несколько месяцев назад. Надеюсь, эта функция теперь реализована и очень проста в использовании.

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

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

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

    'attributes' => array('first_name' => 'First Name')
    
  • Локально Это то, о чем говорил Тейлор Отуэлл в issue, когда он говорит:

    Теперь вы можете вызвать 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

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

/*
|--------------------------------------------------------------------------
| 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 a relation
),

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

Ответ 3

С 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 

Ответ 4

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

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

 <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() ключ "register" (или что-то еще, что вы используете), как этот

@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>

Ответ 5

Атрибут: может использовать только имя атрибута (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!',
);

Ответ 6

Поздний ответ, но может помочь кому-то

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

а затем, например, когда у вас в модели

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

И не хочу как ошибка please enter a group id

Вы можете создать "приятные" сообщения проверки, добавив в 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.

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

Ответ 7

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

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

// translate attributes
if(Lang::has($customLanguageFile)) {
    $validator->setAttributeNames($customLanguageFile);
}

Ответ 8

Ну, это довольно старый вопрос, но мне мало что я должен указать, что проблема наличия языка, появляющегося в 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;