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

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

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

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

【问题讨论】:

    标签: php mysql forms laravel validation


    【解决方案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'])
            ];
        }
        

        【讨论】:

          猜你喜欢
          • 2020-07-15
          • 2014-10-31
          • 2019-06-19
          • 2020-08-09
          • 2011-05-11
          • 2011-02-01
          • 2015-12-26
          • 2020-08-02
          • 2011-03-18
          相关资源
          最近更新 更多