2012-12-20 49 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