首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使Laravel的notIn验证规则大小写不敏感

使Laravel的notIn验证规则大小写不敏感
EN

Stack Overflow用户
提问于 2018-05-07 13:19:12
回答 4查看 9K关注 0票数 1

我在数据库中存储一个字符串数组(db列类型为JSON)。有一个表单允许用户向这个数组添加一个值。我想确保这个数组中没有副本。notIn验证规则似乎是防止重复的最简单的解决方案,但它区分大小写。因此,当使用notIn时,我无法阻止具有不同大写化的相同字符串。

代码语言:javascript
复制
$this->validate(request(), [
    'choice' => [
        'required',
        Rule::notIn($choices)
    ]
]);

有人建议我如何修正这个验证,以便字符串比较不区分大小写吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-05-07 13:36:25

您可以将输入数据和当前数据小写如下:

代码语言:javascript
复制
$input = request()->all();
$input['choice'] = array_map("strtolower", $input['choice']);
request()->validate($input, [
    'choice' => [
        'required',
        Rule::notIn(array_map("strtolower", $choices))
    ]
]);
票数 5
EN

Stack Overflow用户

发布于 2018-05-07 15:20:57

谢谢拉米·赫里亚,我把他的答案扩展到了一个FormRequest类中:

代码语言:javascript
复制
protected function validationData()
{
    $all = parent::validationData();
    //Convert request value to lowercase
    $all['choice'] = strtolower($all['choice']);
    return $all;
}

public function rules()
{
    $choices = $this->route('modelName')->choices;
    return [
        'choice' => [
            'required',
            //Also convert array to lowercase
            Rule::notIn(array_map('strtolower', $choices))
        ]
    ];
}
票数 3
EN

Stack Overflow用户

发布于 2020-01-17 15:18:14

您可以编写自己的验证规则类:

代码语言:javascript
复制
use Illuminate\Contracts\Validation\Rule;
use Illuminate\Validation\Concerns\ValidatesAttributes;
use Illuminate\Validation\Rules\In;

class CaseInsensitiveInRule extends In implements Rule
{
    use ValidatesAttributes;
    private const FORMAT_FUNCTION = 'strtoupper';

    public function __construct(array $values)
    {
        $this->values = array_map(self::FORMAT_FUNCTION, $values);
    }

    public function passes($attribute, $value)
    {
        $value = call_user_func(self::FORMAT_FUNCTION, $value);

        return $this->validateIn($attribute, $value, $this->values);
    }

    public function message()
    {
        return __('validation.invalid_value');
    }
}

接下来,您可以在请求类中创建一个对象。

代码语言:javascript
复制
public function rules(): array
{
    return [
        'status' => new CaseInsensitiveInRule(['active', 'deleted'])
    ];
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50215233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档