使用Laravel验证验证UUID

10

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


因为我真的想要一个,所以我自己建了一个:https://github.com/rap2hpoutre/uuid-rule - rap-2-h
5个回答

18

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

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

至少对我来说不起作用。我认为这是个错误。对于5.7版本,Laravel明确指出应该可用,但实际上并没有。也许在5.8中已经修复了,但由于包依赖关系尚无法升级 :-( - Juha Vehnia
请注意,如果您像required|uuid|string这样做,uuid将无法正常工作,您应该将其更改为required|uuid而不是字符串。 - Fadi

13

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 现在默认包含在 Laravel 中的原因,不需要再包含自己的正则表达式。

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

1
将代码 Validator::extend() 放置于 AppServiceProvider 类的 boot() 方法中。 - ibnɘꟻ

7
你可以扩展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);
});

希望这符合您的要求。

1
请注意,正则表达式\u200c\u200b中有一些不可见的Unicode字符。 - Fluff
返回不包含不可见符号的字符串: 返回 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); - Solo.dmitry

1

对于在Laravel 5.7中使用验证uuid方法遇到问题的人,我通过更新Laravel(从5.7.6更新到5.7.28)来解决了这个问题!


0

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']
        ];
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接