Laravel 验证逗号分隔字符串中的所有元素

问题描述 投票:0回答:3

如何验证具有多个值的一个输入?我正在使用引导标签输入插件。它返回一个字段中的所有标签。我需要验证这个标签 - 唯一的。 首先,我尝试将此标签放入数组中,然后在请求中验证它,但仍然没有成功。 这是我的请求代码:

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 为字符串,给定数组。

有什么问题吗?

php laravel laravel-validation
3个回答
14
投票

我在 5.4 上遇到了类似的逗号分隔电子邮件问题。我是这样解决的:

在您的请求类中,重写

prepareForValidation()
方法(顺便说一句,默认情况下不执行任何操作),并分解逗号分隔的字符串。

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

现在你可以使用 Laravel 的正常数组验证

由于我的案例也需要在消息上更加明确,所以我还添加了一些属性和消息自定义。我提出了一个要点,如果你也感兴趣的话


6
投票

对于 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'


0
投票

重写

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'));
}
© www.soinside.com 2019 - 2024. All rights reserved.