Как использовать настраиваемые атрибуты проверки в массиве входных данных

Я использую Laravel для создания формы, содержащей массив входных данных, и мне трудно показать переведенное имя атрибута при возникновении ошибки проверки. Для простоты я опубликую простой пример своей проблемы.

Форма внутри представления:

<form method="POST" action="{{ route('photo.store') }}" accept-charset="UTF-8" role="form">
<input name="_token" type="hidden" value="{{ csrf_token() }}">
<div class="row">
    <div class="col-lg-12">
        <div class="form-group{{ $errors->has('testfield') ? ' has-error' : '' }}">
            <label class="control-label"
                   for="testfield">{{ trans('validation.attributes.testfield') }}</label>
            <input class="form-control" name="testfield" type="text" id="testfield"
                   value="{{ old('testfield') }}">
            @if ($errors->has('testfield'))
                <p class="help-block">{{ $errors->first('testfield') }}</p>
            @endif
        </div>
    </div>
    <div class="col-lg-12">
        <div class="form-group{{ $errors->has('testfieldarray.0') ? ' has-error' : '' }}">
            <label class="control-label"
                   for="testfieldarray-0">{{ trans('validation.attributes.testfieldarray') }}</label>
            <input class="form-control" name="testfieldarray[]" type="text" id="testfieldarray-0"
                   value="{{ old('testfieldarray.0') }}">
            @if ($errors->has('testfieldarray.0'))
                <p class="help-block">{{ $errors->first('testfieldarray.0') }}</p>
            @endif
        </div>
    </div>
    <div class="col-lg-12">
        <div class="form-group{{ $errors->has('testfieldarray.1') ? ' has-error' : '' }}">
            <label class="control-label"
                   for="testfieldarray-1">{{ trans('validation.attributes.testfieldarray') }}</label>
            <input class="form-control" name="testfieldarray[]" type="text" id="testfieldarray-1"
                   value="{{ old('testfieldarray.1') }}">
            @if ($errors->has('testfieldarray.1'))
                <p class="help-block">{{ $errors->first('testfieldarray.1') }}</p>
            @endif
        </div>
    </div>
</div>
<div class="row">
    <div class="col-lg-12">
        <input class="btn btn-primary" type="submit" value="Gravar">
    </div>
</div>

Rules function in the form request:

public function rules() {
    $rules = [
        'testfield' => array('required'),
    ];

    foreach ($this->request->get('testfieldarray') as $key => $val) {
        $rules['testfieldarray.' . $key] = array('required');
    }

    return $rules;
}

lang / en / validation.php

'attributes' => [
    'testfield' => 'Test Field',
    'testfieldarray' => 'Test Field Array',
],

Проверка выполняется правильно, как и сообщения об ошибках. Единственная проблема в сообщениях об ошибках - это имя отображаемого атрибута. В обоих входах массива имя атрибута, вставленного в сообщение, - «testfieldarray.0» и «testfieldarray.1» вместо «Test Field Array». Я уже пытался добавить в языковой файл testfieldarray.0 => Test Field Array, testfieldarray.1 => Test Field Array, но сообщения остались без изменений. Есть ли способ правильно передать имена атрибутов?


person user3155378    schedule 21.05.2015    source источник
comment
Вы можете зацикливать каждый «testfieldarray» для массива настраиваемых сообщений при проверке, точно так же, как вы это делаете с правилами. После поиска в Google в течение 1 секунды ericlbarnes.com/laravel-array-validation   -  person oBo    schedule 21.05.2015
comment
Разве вы не должны добавить attributes. перед 'testfieldarray.' . $key   -  person saadel    schedule 10.08.2015


Ответы (2)


Посмотрите пример добавления пользовательских правил для проверки значений целочисленного типа в массиве

Открыть файл

/resources/lang/en/validation.php

Затем добавьте собственное сообщение.

// add it before "accepted" message.
'numericarray'         => 'The :attribute must be numeric array value.',

Снова откройте другой файл, чтобы добавить собственные правила проверки.

/app/Providers/AppServiceProvider.php

Итак, добавьте собственный код проверки в функцию загрузки.

public function boot()
{
    $this->app['validator']->extend('numericarray', function ($attribute, $value, $parameters)
    {
        foreach ($value as $v) {
            if (!is_int($v)) {
                return false;
            }
        }
        return true;
    });
}

Теперь вы можете использовать числовой массив для проверки значений целочисленного типа массива.

$this->validate($request, [
            'input_filed_1' => 'required',
            'input_filed_2' => 'numericarray'
        ]);

----------- Удачи --------------

person Majbah Habib    schedule 05.09.2016

Используйте пользовательские сообщения об ошибках внутри родительского метода ....

public function <metod>(Request $request) {
    $rules = [
        'testfield' => 'required'
    ];
    $messages = [];

    foreach ($request->input('testfieldarray') as $key => $val) {
        $rules['testfieldarray.' . $key] = 'required';
        $messages['testfieldarray.' . $key . '.required'] = 'Test field '.$key.' is required';
    }

    $validator = Validator::make($request->all(), $rules,$messages);
        if ($validator->fails()) {
            $request->flash();
            return redirect()
                ->back()
                ->withInput()
                ->withErrors($validator);
        }
    }
}
person Carlos Arauz    schedule 17.11.2015