Php Laravel表单验证-MessageBag中没有输入数组的数组索引
我有一个表单,它有一个输入“数组”,提交时使用Laravel的 验证按预期工作,将规则应用于每个数组元素,并相应地返回错误消息包 问题是:MessageBag没有引用数组的相关索引。 是否有一种方法(除了为数组的每个可能索引定义规则外)使Laravel引用相关的输入数组索引 示例HTMLPhp Laravel表单验证-MessageBag中没有输入数组的数组索引,php,laravel,laravel-4,laravel-validation,Php,Laravel,Laravel 4,Laravel Validation,我有一个表单,它有一个输入“数组”,提交时使用Laravel的 验证按预期工作,将规则应用于每个数组元素,并相应地返回错误消息包 问题是:MessageBag没有引用数组的相关索引。 是否有一种方法(除了为数组的每个可能索引定义规则外)使Laravel引用相关的输入数组索引 示例HTML <input name="something[]" type="text" /> <input name="something[]" type="text" /> <input n
<input name="something[]" type="text" />
<input name="something[]" type="text" />
<input name="something[]" type="text" />
...
验证后的示例MessageBag(未引用输入数组索引)
您的验证器应该如下所示:
Validator::make
(
Input::all(),
array
(
'something' => 'required,unique:somewhere'
));
我没有找到任何使用标准Laravel核心功能来实现这一点的方法,因此我最终扩展了
验证器
类来实现一个解决方案
下面的代码是为了更好地理解此解决方案而编写的
app/libraries/MyApp/Validation
目录以容纳新类\illumb\Validation\Validator
:Validator#passes()
注意:这是一个实用的解决方案,对我的问题很有效。如您所见,数组索引与输入名称一起以相同的字符串传递。您可能希望对内容进行更多的扩展,以使
验证器
返回一个对象或一个数组,其中名称和索引作为独立的内容。请您进一步澄清您的问题,以便我了解您确切期望的输出是什么样的!输出应该引用
元素的索引,这样我就可以将错误绑定到特定的表单元素。现在,Laravel只引用元素的名称(“某物”),它可以是
中的任何一个。您会使用
?您不能使用类似于
..
的东西吗?你能告诉我你到底打算做什么吗?也许我能给你一个更好的主意!PHP自动将名称以[]
结尾的输入解析为数组。如果我在名称中添加“_1”、“_2”等,我必须为每个输入创建特定的Laravel验证器规则(这是我试图避免的)。对不起,我看不到这种方法如何解决我的问题。您能提供一个如何使用此代码识别输入数组索引的示例吗?它解决了您的问题吗?我认为您不能在用于验证的阵列中使用另一个。如果仍然显示错误,请告诉我。希望这能奏效。我想你指的是我使用规则数组数组(“必需”、“存在:某处”)
而不是逗号分隔它们。这不是问题,那部分工作正常。
object(Illuminate\Support\MessageBag)#150 (2)
{
["messages":protected]=> array(6)
{
["something"]=> array(1)
{
[0]=> string(26) "Some error message"
}
}
...
}
Validator::make
(
Input::all(),
array
(
'something' => 'required,unique:somewhere'
));
namespace MyApp\Validation;
use \Illuminate\Validation\Validator;
class ArrayAwareValidator extends Validator
{
//Override Validator#passes() method
public function passes()
{
//For each validation rule...
foreach ($this->rules as $attribute => $rules)
{
//Get the value to be validated by this rule
$values = $this->getValue($attribute);
//If the value is an array, we got an HTML input array in our hands
if(is_array($values))
{
//Iterate through the values of this array...
for($i=0; $i<count($values); $i++)
{
//...and create a specific validation rule for this array index
$this->rules[$attribute.".".$i] = $rules;
}
//Delete original rule
unset($this->rules[$attribute]);
}
}
//Let Validator do the rest of the work
return parent::passes();
}
}
object(Illuminate\Support\MessageBag)#151 (2)
{
["messages":protected]=> array(2)
{
["something.0"]=>
array(1)
{
[0]=> string(26) "Some error message"
}
["something.1"]=>
array(1)
{
[0]=> string(26) "Some error message"
}
}
...
}