2012-12-20 23 views
0

我已经在我的形式,像一些地区其命名为:Laravel审定阵列

<ul> 
<li> 
<input type="checkbox" name="post_categories[]" value="16">English First Main Category<br> 
<ul> 
<li><input type="checkbox" name="post_categories[]" value="17">English First Subcategory<br></li> 
</ul> 
</li> 
</ul> 

当我试图验证他们为必填字段或别的东西,Laravel未通过验证的规则。我的规则类似下面(在/application/models/posts.php):

public static $rules = array(

    'post_title' => 'required', 
    'post_body' => 'required', 
    'content_language'=>'required|alpha', 
    'post_categories'=>'array_numeric', 
    'post_sequence_number'=>'numeric' 

    ); 


public static function validate($data){ 

    return Validator::make($data, static::$rules); 

} 

在/application/library/validate.php我是验证阵列功能是数字或不:

Class Validator extends Laravel\Validator { 

     public function validate_array_numeric($attribute, $value, $parameters){ 
      $numeric_values = array_filter($value, create_function('$item', 'return (is_numeric($item));')); 
      return count($numeric_values) == count($value); 
     } 

    } 

除了post_categories []之外,规则完美地起作用。我收到错误:

Method [array_numeric] does not exist. 

干杯。

+0

我会尝试先解开他们,然后删除方括号。可能是Laravel框架中的一个错误? – Geo

+0

试过...我想是的,有一个bug ... –

+0

另一个想法是,他们是两个同名的输入。这是正确的吗? – Geo

回答

3

我不知道这个问题是否已经在Laravel 4中解决了。也许你可以试试它。 但是我现在正在做的是扩展验证类。

您可以创建一个扩展验证类的新库。 验证数组中的所有项目是否具有数值。这是在application/libraries

class Validator extends Laravel\Validator { 

    public function validate_arraynumeric($attribute, $value, $parameters){ 
     $numeric_values = array_filter($value, create_function('$item', 'return (is_numeric($item));')); 
     return count($numeric_values) == count($value); 
    } 

} 

当验证失败时更改默认错误消息。去application/language/en/validation.php。只需使用函数的名称作为新的数组项关键:

"arraynumeric" => "The :attribute contains non-numeric values", 

更新

然后,你需要从application/config/application.php文件中删除以下行:

'Validator' => 'Laravel\\Validator'

要使用新验证:

public static $rules = array(
'post_categories'=>'array_numeric' 
); 

现在为所需的复选框。我假设你只需要检查一个复选框。你可以在新的验证功能中检查复选框的数量是否至少为1.

+0

感谢您的有益答案。 –

+0

我有错误方法[arraynumeric]不存在。 –

+0

你可以发布你的代码吗?也许更新您的原始问题,以便我可以看到。正如你可能已经注意到的,有一个错字。我没有调用'arraynumeric',而是调用'array_numeric' –

0

你在做这件事很奇怪。使用post_categories[]作为表格名称生成数组。这意味着您无法使用'post_categories[]'=>'required|numeric'进行验证。相反,您必须遍历数组并自行验证每个字段。

+0

嗯我该怎么办? –

5

我必须解决同样的问题。以下是我所做的:

我创建了一个自定义类,它扩展了默认的Laravel\Validator类。我希望能够在我处理多个值时告诉验证者(如您的情况)。在我的实现中,可以通过将'_array'附加到特定字段名称的每个验证规则来完成。我的课所做的是检查规则名是否有这个后缀,如果它确实将value参数(在这种情况下是一个数组)分解为它包含的项并传递给Laravel中的默认验证函数。

<?php 

class Validator extends Laravel\Validator { 

    public function __call($method, $parameters) 
    { 
     if (substr($method, -6) === '_array') 
     { 
      $method = substr($method, 0, -6); 
      $values = $parameters[1]; 
      $success = true; 
      foreach ($values as $value) { 
       $parameters[1] = $value; 
       $success &= call_user_func_array(array($this, $method), $parameters); 
      } 
      return $success; 
     } 
     else 
     { 
      return parent::__call($method, $parameters); 
     } 
    } 

    protected function getMessage($attribute, $rule) 
    { 
     if (substr($rule, -6) === '_array') 
     { 
      $rule = substr($rule, 0, -6); 
     } 

     return parent::getMessage($attribute, $rule); 
    } 
} 

正如帖子上面说,你将不得不作出如下更改,以便您的自定义Validator类可以由自动发现:

Then you need to remove the following line from application/config/application.php file:

'Validator' => 'Laravel\Validator'

当做到这一点,你就可以使用'_array'后缀的所有Laravel验证规则。这里有一个例子:

public static $rules = array(
    'post_categories'=>'required_array|alpha_array' 
); 
+1

我检查了代码,我认为它应该是getMessage($ attribute,$ rule) – llt

+0

@llt谢谢,你是对的。 – planewalker

+0

@planewalker这是否适用于L4? – Arda