Php Laravel表单验证-MessageBag中没有输入数组的数组索引

Php 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

我有一个表单,它有一个输入“数组”,提交时使用Laravel的

验证按预期工作,将规则应用于每个数组元素,并相应地返回错误消息包

问题是:MessageBag没有引用数组的相关索引。 是否有一种方法(除了为数组的每个可能索引定义规则外)使Laravel引用相关的输入数组索引

示例HTML

<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()

  • 客户端,使用JavaScript,我将名称从索引中拆分(例如“something.1”到“something”和“1”),然后使用此信息来标识正确的表单输入。我正在使用Ajax提交表单,因此您可能需要在这里使用不同的方法


  • 注意:这是一个实用的解决方案,对我的问题很有效。如您所见,数组索引与输入名称一起以相同的字符串传递。您可能希望对内容进行更多的扩展,以使
    验证器
    返回一个对象或一个数组,其中名称和索引作为独立的内容。

    请您进一步澄清您的问题,以便我了解您确切期望的输出是什么样的!输出应该引用
    元素的索引,这样我就可以将错误绑定到特定的表单元素。现在,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"
            }
        }
        ...
    }