簡體   English   中英

Laravel 驗證 - 以逗號分隔的字符串輸入為數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM