我的形式中有一些区域是:
<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 :(得分: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);
}
}
如上面的帖子中所述,您必须进行以下更改,以便Autoloader可以找到您的自定义Validator
课程:
然后你需要删除以下行 application / config / application.php文件:
'Validator'=&gt; 'Laravel \验证'
完成此操作后,您将能够使用所有Laravel的验证规则和'_array'后缀。这是一个例子:
public static $rules = array(
'post_categories'=>'required_array|alpha_array'
);
答案 1 :(得分: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,则选中已选中复选框的计数。
答案 2 :(得分:0)
你这里做的很奇怪。
使用post_categories[]
作为表单名称生成一个数组。这意味着您无法使用'post_categories[]'=>'required|numeric'
对其进行验证。相反,你必须遍历数组并验证它自己的每个字段。