Атрибуты проверки 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;