![](/img/trans.png)
[英]Laravel Validation between not converting comma separated string to array?
[英]Laravel validation - comma separated string input as array
如何使用多個值驗證一個輸入? 我正在使用引導標簽輸入插件。 它返回一個字段中的所有標簽。 我需要驗證這個標簽 - 獨一無二。 首先,我試圖將此標簽放入數組中,然后在請求中對其進行驗證,但仍然沒有運氣。 這是我的請求代碼:
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: htmlentities() 期望參數 1 為字符串,給定數組。
任何想法有什么問題?
我在 5.4 上遇到了用逗號分隔的電子郵件的類似問題。 這是我解決它的方法:
在您的請求類中,覆蓋prepareForValidation()
方法(默認情況下不執行任何操作,順便說一句),並分解逗號分隔的字符串。
/**
* @inheritDoc
*/
protected function prepareForValidation()
{
$this->replace(['keywords' => explode(',', $this->keywords)]);
}
現在你可以使用 Laravel 的普通數組驗證了!
由於我的案例也需要對消息更加明確,因此我還添加了一些屬性和消息自定義。 我做了一個要點,如果你也感興趣的話
重寫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'));
}
Laravel 6+ 有一個包可以將這些驗證應用於逗號分隔的值字符串,而不是改變您的輸入:
https://github.com/spatie/laravel-validation-rules#delimited
你需要安裝它:
composer require spatie/laravel-validation-rules
然后,您可以將其用作規則(建議使用FormRequest
)。
例如,要驗證所有項目都是電子郵件,長度不超過 20 個字符並且至少有 3 個字符,您可以使用:
use Spatie\ValidationRules\Rules\Delimited;
// ...
public function rules()
{
return [
'emails' => [(new Delimited('email|max:20'))->min(3)],
];
}
驗證器的構造函數接受驗證規則字符串、驗證實例或數組。 該規則用於驗證所有單獨的值; 在這種情況下, 'email|max:20'
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.