在Laravel中显示输入数组的验证错误

时间:2015-02-04 23:53:28

标签: php validation laravel

我正在向控制器提交一系列输入,如下所示:

<input id="box-1-nickname" name="box-nickname[]" class="form-control" type="text" placeholder="Required">
<input id="box-2-nickname" name="box-nickname[]" class="form-control" type="text" placeholder="Required">

我正在做这样的验证:

$validator = Validator::make(Input::all(), array(
        'supplies-count' => 'required|in:0,1,2,3,4',
    ));

$arrayValidator = Validator::make(Input::all(), []);

$arrayValidator->each('box-nickname', ['required|min:1|max:60']);

if( $validator->fails() || $arrayValidator->fails() ) {
    return Redirect::route('route-2')
           ->withErrors($arrayValidator)
           ->withInput();
}

问题是,当我尝试检查这样的错误时,它不起作用:

if( $errors->has('box-1-nickname') ) { echo ' has-error'; }

4 个答案:

答案 0 :(得分:4)

您可能很久以来就找到了解决方案,但对于其他任何偶然发现错误的人来说:

验证器使用字段数组键的数组点表示法。例如,box-nickname[0]变为box-nickname.0

因此if( $messages->has('box-nickname.0') ) { echo ' has-error'; }应该会为您提供所需的结果。但是,您需要动态生成数组键,因为您已经说过,您不知道应用了多少个盒昵称。我在表单视图中使用它:

@if(!is_null(Input::old('box-nickname')))
    @foreach(Input::old('box-nickname') as $n => $box-nickname)
        @include('box-nickname-create-form-partial')
    @endforeach
@endif

然后创建一个名为&#34; box-nickname-create-form-partial.blade.php&#34;的部分视图。或者你想用表单字段调用它,可能看起来像这样:

<div class="form-group {!! $errors->has('box-nickname.'.$n) ? ' has-error' : '' !!}">
    <input name="box-nickname[{{$n}}]" class="form-control" type="text" placeholder="Required">
</div>

我希望这会有所帮助。

答案 1 :(得分:0)

错误由name属性收集,而不是id,而Laravel的默认MessageBag变量为$messages,而不是$errors

if( $messages->has('box-nickname') ) { echo ' has-error'; }

http://laravel.com/docs/4.2/validation#working-with-error-messages

答案 2 :(得分:0)

$errors是正确的,但您应该检查box-nickname。如您所见,由于通用名称,您将遇到无法识别哪个盒子的问题。我认为最简单的方法是为每个输入提供一个唯一的名称(例如box-1box-2),并在服务器端执行for循环以检索以box-开头的输入。 / p>

答案 3 :(得分:0)

在视图中显示输入数组错误(从L5.8起)

要获取输入数组的第一个验证错误:

{{ $errors->first('input_array.*') }}

要检查输入数组中是否有错误:

@if($errors->has('input_array.*'))
    <h1>There is an error in your input array</h1>
    <ul>
       @foreach($errors->get('input_array.*') as $errors)
           @foreach($errors as $error)
               <li>{{ $error }}</li>
           @endforeach
       @endforeach
    </ul>
@endif

其他示例:

@error('input_array.*')
    <div class="alert alert-danger">{{ $message }}</div>
@enderror

来自5.8 ^文档

Working with error messages

  

如果您要验证数组形式字段,则可以使用*字符检索每个数组元素的所有消息:

foreach ($errors->get('attachments.*') as $message) {
    //
}

希望有帮助!