使 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 验证规则不区分大小写的主要内容,如果未能解决你的问题,请参考以下文章