0

我的表格中有一些区域,例如:

<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.

干杯。

4

3 回答 3

5

我不得不解决同样的问题。这是我所做的:

我创建了一个扩展默认类的自定义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自动加载器可以找到您的自定义类:

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

'验证器' => 'Laravel\验证器'

完成此操作后,您将能够使用 Laravel 的所有带有 '_array' 后缀的验证规则。这是一个例子:

public static $rules = array(
  'post_categories'=>'required_array|alpha_array'
);
于 2013-01-07T15:44:47.877 回答
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,则您只需检查新验证的功能即可。

于 2012-12-20T23:38:21.610 回答
0

你在这里做一些奇怪的事情。

使用post_categories[]作为表单名称会生成一个数组。这意味着您无法使用'post_categories[]'=>'required|numeric'. 相反,您必须遍历数组并自行验证每个字段。

于 2012-12-20T23:19:18.683 回答