【问题标题】:Validate UUID with Laravel Validation使用 Laravel 验证验证 UUID
【发布时间】:2017-10-11 07:41:31
【问题描述】:

是否有内置的方法来使用验证规则验证 UUID?我在“Available Validation Rules”文档中没有找到任何关于此的内容。

【问题讨论】:

标签: php laravel laravel-5 laravel-5.5


【解决方案1】:

实际上,Laravel 5.7 支持 UUID 验证。

$validation = $this->validate($request, [
    'uuid_field' => 'uuid'
]);

基于documentation

【讨论】:

  • 至少不适合我。我认为这是错误。对于 5.7 版本,Laravel 明确指出这应该是可用的,但它不是。也许这已经在 5.8 中修复了,由于包依赖关系,还不能完全升级:-(
  • 请注意,如果您执行required|uuid|string 之类的操作,uuid 将不起作用,您应该在没有字符串的情况下使用required|uuid 进行操作
【解决方案2】:

Laravel 5.6 现在提供了开箱即用的 ramesey/uuid 包。 您现在可以使用它的“isValid”方法来检查 UUID。我注意到上述解决方案中的正则表达式有时会失败。我对 Laravel 内部使用的包没有任何问题。

Validator::extend('uuid', function ($attribute, $value, $parameters, $validator) {
    return \Ramsey\Uuid\Uuid::isValid($value);
});

与问题无关,但您现在也可以使用 Laravel 的“Str”类生成 UUID。这就是为什么现在默认包含 ramsey/uuid 的原因,无需包含您自己的正则表达式。

\Illuminate\Support\Str::uuid();

【讨论】:

  • 将代码Validator::extend() 放在boot() 方法的AppServiceProvider 类中。
【解决方案3】:

您可以在 Laravel 中扩展验证器助手以添加您的自定义验证规则,例如,我创建了自己的验证规则来使用正则表达式验证位置,如下所示:

Validator::extend('location', function ($attribute, $value, $parameters, $validator) {
    return preg_match('/^-?\d{1,2}\.\d{6,}\s*,\s*-?\d{1,2}\.\d{6,}$/', $value);
});

引用此帖:PHP preg_match UUID v4

您可以使用 UUID 正则表达式来创建它,如下所示:

Validator::extend('uuid', function ($attribute, $value, $parameters, $validator) {
    return preg_match('/[a-f0-9]{8}\-[a-f0-9]{4}\-4[a-f0-9]{3}\-(8|9|a|b)[a-f0-9]{3‌​}\-[a-f0-9]{12}/', $value);
});

希望这符合您的要求。

【讨论】:

  • 注意到正则表达式\u200c\u200b中有一些不可见的unicode字符
  • 没有隐形符号的字符串:return preg_match('/^[a-f0-9]{8}\-[a-f0-9]{4}\-4[a-f0-9 ]{3}\-(8|9|a|b)[a-f0-9]{3}\-[a-f0-9]{12}$/', $value);
【解决方案4】:

对于那些在 Laravel 5.7 中使用验证 uuid 方法时遇到问题的人,我通过更新 Laravel 进行了修复(它是 5.7.6,然后在更新 5.7.28 之后)并且它起作用了!

【讨论】:

    【解决方案5】:

    Laravel 5.7 UUID 验证由于某种原因无法正常工作。至少我得到了

    InvalidArgumentException: validation.uuid.
    

    解决此问题的最佳方法是从中创建规则。

    php artisan make:rule UUID
    

    这是我的 UUID 验证规则类:

    namespace App\Rules;
    
    use Illuminate\Contracts\Validation\Rule;
    use Ramsey\Uuid\Uuid as UuidValidator;
    
    class UUID implements Rule
    {
        /**
         * Validate UUID
         *
         * @param  string  $attribute
         * @param  mixed  $value
         * @return bool
         */
        public function passes($attribute, $value)
        {
            return UuidValidator::isValid($value);
        }
    
        /**
         * Get the validation error message.
         *
         * @return string
         */
        public function message()
        {
            return 'Supplied :attribute is not valid UUID!';
        }
    }
    

    那你就可以这样手动使用了

    $validator = Validator::make($data->all(), ['uuid' => new UUID]);
    
    if ($validator->fails()) {
         // Do whatever
    }
    

    或者像这样与http请求验证一起使用

    namespace App\Http\Requests;
    
    use App\Rules\UUID;
    use Illuminate\Foundation\Http\FormRequest;
    
    class UserRequest extends FormRequest
    {
        /**
         * Get the validation rules that apply to the request.
         *
         * @return array
         */
        public function rules()
        {
            return [
                'uuid' => ['required', new UUID],
                'email' => ['required','email']
            ];
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-05
      • 2019-05-20
      • 2016-09-01
      • 2020-10-24
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多