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

Я пытаюсь использовать атрибуты проверки в «language> {language}> validation.php», чтобы заменить имя атрибута (имя ввода) для правильного чтения имени (пример: first_name> 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-адреса или задать язык по умолчанию, чтобы он просто не появился?

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

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

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

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

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

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

Правильный ответ на эту конкретную проблему состоял бы в том, чтобы перейти в вашу папку 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's a relation ), 

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

Начиная с 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 

В массиве «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> 

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

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

В 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.

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

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

 $validator = Validator::make(Input::all(), $rules); $customLanguageFile = strtolower(class_basename(get_class($this))); // translate attributes if(Lang::has($customLanguageFile)) { $validator->setAttributeNames($customLanguageFile); } 

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