2017-02-21 39 views
0

我正在嘗試做輸入數組驗證。現在我得到了這個:Laravel 5輸入驗證名稱正則表達式

$rules = [ 
    'name' => 'required|array', 
]; 

if(array_key_exists('name', $data) && is_array($data['name'])) { 
    foreach ($data['name'] as $key => $value) { 
    $rules['name.' . $key] = 'required|nullable|string|max:255'; 
    } 
} 

$v = Validator::make($data, $rules); 

此代碼的作品,但我想確保密鑰也是正確的。我可以簡單地在foreach循環內添加更多檢查,但這會使驗證器本身無用,因爲手動檢查所有內容會更簡單。

完美,我要實現的是這樣的:由Validator或可能通過它的一些擴展

$v = Validator::make($data, [ 
    'name' => 'required|array', 
    'name.[a-z]{2}' => 'required|nullable|string|max:255' 
]); 

這可能嗎?

回答

1

當然,你可能只寫name.*

$v = Validator::make($data, [ 
    'name' => 'required|array', 
    'name.*' => 'required|nullable|string|max:255' 
]); 

這裏有Laravel Validating Arrays Docs

+0

謝謝,看來我在閱讀文檔時錯過了這篇文章。但是,這仍然不包括我需要驗證數組密鑰的情況。 –

2

你可以這樣做:

在你AppServiceProvider.php擴展您的驗證,包括這條規則:

Validator::extend('customrule', function ($attribute, $value, $parameters, $validator) { 
     return is_array($value) && !empty(array_filter($value, function ($v) { return preg_match("/^[a-z]{2}$/",$v); }); 
}); 

然後在你的代碼:

$rules = [ 
    'name' => 'required|array', 
    'name.*' => 'required|nullable|string|max:255' 
]; 
$extraRules = [ 
    'namekeys' => 'customrule' 
]; 

$v = Validator::make($data, $rules); 
if ($v->valid()) { 
    $v2 = Validator::make(["namekeys" => array_keys($data["name"]) ], $extraRules); 
} 

也許我只是過分複雜的事情。

+0

感謝您的解決方案,我會繼續尋找更簡單的解決方案,但是這個解決方案比我的解決方案簡單得多。 –