Атрибути перевірки Laravel “приємні імена”


82

Я намагаюся використовувати атрибути перевірки у "мова> {мова}> перевірка.php", щоб замінити: ім'я атрибута (ім'я вводу) на належне для читання ім'я (приклад: ім'я_першого> Ім'я). Здається, це дуже просто у використанні, але валідатор не показує "приємних імен".

У мене є таке:

'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-адреси або встановити мову за замовчуванням, щоб вона просто не відображалася там?


Я не впевнений, чи правильно я це розумію, але ви можете встановити мову за замовчуванням у app / config / app.php, який використовуватиметься постачальником послуг перекладу. Для кожної мови потрібно створити відповідну папку в app / lang /. наприклад, якщо у вас є "en" та "nl" як мови, які ви використовуєте у своєму додатку, ви повинні мати обидві папки в app / lang / з відповідними файлами (у цьому прикладі validation.php), тому, коли ви змінюєте мову, цей файл буде завантажено. Щодо видалення мови з URL-адреси, я не зовсім впевнений, але я вважаю, що ви можете цього досягти за допомогою маршрутів.
Altrim

Я знаю, як встановити мови, і переклад вхідних імен працює зараз. Мені потрібно лише знати, як видалити мову з URL-адреси. Я шукатиму це. Дякую!
Хак

Однозначно це можна зробити, див. Мою відповідь нижче.
Хав'єр Кадіс

Відповіді:


143

Так, атрибути "приємного імені", як ви їх назвали, були справжньою "проблемою" кілька місяців тому. Сподіваємось, ця функція зараз реалізована і дуже проста у використанні.

Для простоти я розділю два варіанти вирішення цієї проблеми:

  1. Глобальний, ймовірно, більш поширений. Такий підхід дуже добре пояснено тут , але в основному ви повинні змінити додаток / мова / 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')).
орден

31

Правильною відповіддю на цю конкретну проблему було б перейти до папки 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
),

Тому я вважаю, що цей масив був побудований для спеціальної настройки цих імен атрибутів.


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 

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

Атрибут: може використовувати лише ім’я атрибута (у вашому випадку ім’я), а не приємні імена.

Але ви можете визначити власні повідомлення для кожного атрибута + перевірку за допомогою таких повідомлень, як це:

$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
Хоча цей код може запропонувати вирішення проблеми, настійно рекомендується вказати додатковий контекст щодо того, чому та / або як цей код відповідає на питання. Відповіді лише на код, як правило, стають марними в довгостроковій перспективі, оскільки майбутні глядачі, які стикаються з подібними проблемами, не можуть зрозуміти аргументацію рішення.
E. Zeytinci

0

Ну, це досить давнє запитання, але я мало хто мав би зазначити, що проблему наявності мови, що відображається за URL-адресою, можна вирішити за допомогою:

  • Зміна мови та запасної_мови на config/app.php;
  • або встановивши \ App :: setLocale ($ lang)

Якщо потрібно зберегти його протягом сеансу, я зараз використовую "AppServiceProvider", щоб зробити це, але, я думаю, що проміжне програмне забезпечення може бути кращим підходом, якщо потрібна зміна мови за URL-адресою, тому мені це подобається у мого постачальника:

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

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

Таким чином я обробляю сеанс, і він не прилипає до моєї адреси.

Щоб пояснити, що я зараз використовую Laravel 5.1+, але поведінка не повинна відрізнятися від 4.x;

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.