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\ Validator'

これが行われると、「_array」サフィックスが付いたLaravelのすべての検証ルールを使用できるようになります。次に例を示します。

public static $rules = array(
  'post_categories'=>'required_array|alpha_array'
);
于 2013-01-07T15:44:47.877 に答える
3

この問題がLaravel4で解決されたかどうかはわかりません。たぶんあなたはそれを試すことができます。しかし、私が今していることは、検証クラスを拡張することです。

検証クラスを拡張する新しいライブラリを作成できます。配列内のすべての項目に数値があるかどうかを検証します。これはにあり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つだけチェックする必要があると思います。チェックされたチェックボックスの数が1以上の場合は、新しい検証のために関数をチェックインするだけです。

于 2012-12-20T23:38:21.610 に答える
0

あなたはここで何か奇妙なことをしています。

フォーム名として使用post_categories[]すると、配列が生成されます。これは、で検証できないことを意味します'post_categories[]'=>'required|numeric'。代わりに、配列をループして、各フィールドを独自に検証する必要があります。

于 2012-12-20T23:19:18.683 に答える