Laravel 对名为数组的复选框进行验证
Posted
技术标签:
【中文标题】Laravel 对名为数组的复选框进行验证【英文标题】:Laravel validation on checkbox which named as array 【发布时间】:2012-12-08 12:48:45 【问题描述】:我的表单中有一些区域,例如:
<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.
干杯。
【问题讨论】:
我会先尝试取消嵌套,然后删除方括号。可能是 Laravel 框架中的错误? 试过了...我想是的,有一个错误... 另一个想法是它们是同名的两个输入。这样做对吗? 我只见过同名 attr 的单选按钮。如果两个复选框都被选中了,哪个值将与表单数据一起提交? 复选框是一样的。 【参考方案1】:我必须解决同样的问题。这是我所做的:
我创建了一个扩展默认 Laravel\Validator
类的自定义类。我希望能够在处理多个值时告诉验证器(例如您的情况)。在我的实现中,这可以通过将“_array”附加到某个字段名称的每个验证规则来完成。我的班级所做的是检查规则名称是否有这个后缀,如果有的话,值参数(在这种情况下是一个数组)被分解为其包含的项目并传递给 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
类:
然后你需要删除以下行 应用程序/config/application.php 文件:
'验证器' => 'Laravel\Validator'
完成此操作后,您将能够使用 Laravel 的所有带有 '_array' 后缀的验证规则。这是一个例子:
public static $rules = array(
'post_categories'=>'required_array|alpha_array'
);
【讨论】:
我检查了代码,我认为应该是 getMessage($attribute, $rule) @planewalker 我已经根据您的回答提出了一个问题here。如果你能检查一下你什么时候有空,我将不胜感激。【参考方案2】:不知道这个问题在 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,则您只需检查新验证的功能即可。
【讨论】:
你能发布你的代码吗?也许更新您的原始问题,以便我可以看到。正如您可能已经注意到的那样,这里有一些错字。我没有打电话给arraynumeric
,而是打电话给array_numeric
我已经更新了我的答案。虽然我知道你已经想通了。【参考方案3】:
你在这里做了一些奇怪的事情。
使用post_categories[]
作为表单名称会生成一个数组。这意味着您无法使用'post_categories[]'=>'required|numeric'
对其进行验证。相反,您必须遍历数组并单独验证每个字段。
【讨论】:
以上是关于Laravel 对名为数组的复选框进行验证的主要内容,如果未能解决你的问题,请参考以下文章
当当前输入等于数组内的值时,Laravel 验证 required_if(带有输入文本的复选框)
如何验证单选按钮/复选框并且必须在 laravel 中选择一个