2017-10-06 122 views
1

如何驗證具有多個值的一個輸入?我正在使用bootstrap tagsinput插件。它返回一個字段中的所有標籤。我需要驗證這個標籤 - 唯一。 首先,我試圖將這個標籤放入數組中,然後在請求中驗證它,但仍然沒有運氣。 這裏是我的代碼的請求:Laravel驗證 - 以逗號分隔的字符串輸入作爲數組

public function all() 
{ 
    $postData = parent::all(); 

    // checkbox status 
    if(array_key_exists('keywords', $postData)) { 

     // put keywords into array 
     $keywords = explode(',', $postData['keywords']); 

     $test = []; 
     $i = 0; 
     foreach($keywords as $keyword) 
     { 
      $test[$i] = $keyword; 
      $i++; 
     } 
     $postData['keywords'] = $test; 

    } 

    return $postData; 

} 

public function rules() 
{ 
    $rules = [ 
     'title' => 'required|min:3|unique:subdomain_categories,title|unique:subdomain_keywords,keyword', 
     'description' => '', 
     'image' => 'required|image', 
     'keywords.*' => 'min:3' 
    ]; 

    return $rules; 
} 

但只要關鍵字變爲無效我得到這個錯誤:在helpers.php線531

ErrorException: ヶ輛()預計參數1爲字符串,數組給出。

任何想法有什麼不對?

回答

1

重寫all()方法來驗證字段不是一個好習慣。

如果您收到逗號分隔的字符串,而不是您想要驗證的數組,但沒有可用的通用方法,請自行編寫。

App/Providers/ValidatorServiceProvider只需添加一個新的驗證:

public function boot() 
{ 
    Validator::extend('keywords', function ($attribute, $value, $parameters, $validator) 
    { 
     // put keywords into array 
     $keywords = explode(',', $value); 

     foreach($keywords as $keyword) 
     { 
      // do validation logic 
      if(strlen($keyword) < 3) 
      { 
       return false; 
      } 
     } 

     return true; 
    } 
} 

現在,您可以根據需要在任何要求使用這個驗證規則,它是可重複使用的

public function rules() 
{ 
    $rules = [ 
     'title'  => 'required|min:3|unique:subdomain_categories,title|unique:subdomain_keywords,keyword', 
     'description' => 'nullable', 
     'image'  => 'required|image', 
     'keywords' => 'keywords', 
    ]; 

    return $rules; 
} 

如果驗證通和你想的關鍵字在您的要求數組訪問,寫你自己的方法:

public function keywords() 
{ 
    return explode(',', $this->get('keywords')); 
} 
+0

這是行不通的... 這很奇怪,因爲如果我嘗試:dd($ this-> request-> get('keywords')); 它傾倒「項目1,項目2」。好像它沒有改變關鍵字到數組 – general666

+0

'$ this-> request-> get('keywords')是什麼內容是它是一個key =>值的數組還是一個逗號分隔的字符串 – Webdesigner

+0

它是逗號分隔的字符串... – general666

0

我也陷入了類似的問題與逗號的分隔的電子郵件5.4。以下是我如何解決它:

在您的請求類中,覆蓋prepareForValidation()方法(默認情況下,它什麼也不做,btw),並分解逗號分隔的字符串。

/** 
* @inheritDoc 
*/ 
protected function prepareForValidation() 
{ 
    $this->replace(['keywords' => explode(',', $this->keywords)]); 
} 

現在您可以使用Laravel的正常array validation

由於我的情況需要對消息更加明確一些,所以我還添加了一些屬性和消息自定義。我做了a gist,如果這也是你感興趣的