Laravel 5 多字段验证
Posted
技术标签:
【中文标题】Laravel 5 多字段验证【英文标题】:Laravel 5 Multiple Fields Validation 【发布时间】:2015-07-28 00:48:08 【问题描述】:我在视图中有一个字段,类似于
<div>
<input type="text" name="new[0][description]" id="description-new-0">
<input type="text" name="new[0][amount]" id="amount-new-0">
</div>
<div>
<input type="text" name="new[1][description]" id="description-new-1">
<input type="text" name="new[1][amount]" id="amount-new-1">
</div>
等等...所以您可以想象它是一个动态字段,每次您勾选添加按钮或其他任何内容时都会添加到表单中。
问题是如何验证这些动态字段并为每个字段返回正确的错误?
谢谢!
注意这是 Laravel 5,但如果你有一个类似于这个的 Laravel 4 解决方案,我猜(真的猜到了)它会起作用。
谢谢大家!
【问题讨论】:
您应该能够在评估期间使用点符号来访问嵌套数组项,因此请为new.description
和new.amount
创建规则
【参考方案1】:
在文件夹中创建此表单的请求验证器,例如
<?php
use Illuminate\Foundation\Http\FormRequest;
class MultipleRequest extends FormRequest
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
return true;
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
$rules = [
'description' => 'required|array',
];
if ($this->request->get('description'))
foreach($this->request->get('description') as $key => $val)
$rules['description.'.$key] = 'required|min:7'; //example
return $rules;
public function messages()
$messages = [];
if ($this->request->get('description'))
foreach ($this->request->get('description') as $key => $val)
$messages['description.' . $key . '.min'] = 'Wrong field.';
$messages['description.' . $key . '.required'] = 'This field required.';
return $messages;
更多信息How To: Validate an array of form fields with Laravel
然后在视图中做下一个
@if (Session::has('_old_input'))
@for ($i=0; $i<count(Session::get('_old_input.description')); $i++)
<div>
@if($errors->any() && Session::get('errors')->getBag('default')->has('description.' . $i))
<p class="">Session::get('errors')->getBag('default')->first('description.' . $i)</p>
@endif
<input type="text" name="new[][description]" id="description-new-$i" value="Session::get('_old_input.description.' . $i)">
<input type="text" name="new[][amount]" id="amount-new-$i" value="Session::get('_old_input.amount.' . $i)">
</div>
@endfor
@endif
因此您为每个带有输入的块添加带有错误消息的块。在我的示例中,仅处理了描述,您可以处理类似描述的数量 对我来说它有效并且看起来像
更新: Laravel 5.2 版具有数组验证,因此您可以创建请求验证器,例如:
public function rules()
return [
'names.*' => 'required|max:50',
'emails.*' => 'required|max:100',
];
更多信息请阅读DOC
【讨论】:
以上是关于Laravel 5 多字段验证的主要内容,如果未能解决你的问题,请参考以下文章