使 Laravel 的 notIn 验证规则不区分大小写

Posted

技术标签:

【中文标题】使 Laravel 的 notIn 验证规则不区分大小写【英文标题】:Make Laravel's notIn validation rule case insensitive 【发布时间】:2018-10-17 07:41:36 【问题描述】:

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

$this->validate(request(), [
    'choice' => [
        'required',
        Rule::notIn($choices)
    ]
]);

是否有人建议我应该如何修复此验证,以便字符串比较不区分大小写?

【问题讨论】:

【参考方案1】:

您可以像这样将输入数据和当前数据小写:

$input = request()->all();
$input['choice'] = array_map("strtolower", $input['choice']);
$this->validate($input, [
    'choice' => [
        'required',
        Rule::notIn(array_map("strtolower", $choices))
    ]
]);

【讨论】:

【参考方案2】:

感谢Ramy Herria,我能够将他的答案扩展为也可以在 FormRequest 类中工作:

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】:

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

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');
    

接下来你可以在你的请求类中创建一个对象

public function rules(): array

    return [
        'status' => new CaseInsensitiveInRule(['active', 'deleted'])
    ];

【讨论】:

以上是关于使 Laravel 的 notIn 验证规则不区分大小写的主要内容,如果未能解决你的问题,请参考以下文章

如何使唯一数组的自定义验证规则依赖于其他字段 laravel

如果值存在于另一个字段数组中,Laravel 验证规则

使用用户名的 Laravel 身份验证不区分大小写

如何使 Laravel 中的路线不区分大小写?

基于数据透视表 laravel 的唯一名称规则验证

如何使这个 .htaccess 规则不区分大小写?