使用 Laravel 验证验证 UUID
Validate UUID with Laravel Validation
是否有内置的方法来使用验证规则来验证 UUID?我在“Available Validation Rules”文档中没有找到任何相关信息。
您可以在 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);
});
引用此 post: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);
});
希望这符合您的要求。
Laravel 5.6 现在提供开箱即用的 ramesey/uuid 包。
您现在可以使用其 "isValid" 方法来检查 UUID。我注意到上面解决方案中的正则表达式有时会失败。 Laravel 内部使用的包我还没有遇到任何问题。
Validator::extend('uuid', function ($attribute, $value, $parameters, $validator) {
return \Ramsey\Uuid\Uuid::isValid($value);
});
与问题无关,但您现在也可以使用 Laravel 中的 "Str" class 生成 UUID。这就是现在默认包含 ramsey/uuid 的原因,无需包含您自己的正则表达式。
\Illuminate\Support\Str::uuid();
实际上,Laravel 5.7支持UUID验证。
$validation = $this->validate($request, [
'uuid_field' => 'uuid'
]);
Laravel 5.7 UUID 验证由于某种原因无法正常工作。至少我得到
InvalidArgumentException: validation.uuid.
解决此问题的最佳方法是创建规则。
php artisan make:rule UUID
这是我的 UUID 验证规则 class:
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']
];
}
}
对于那些在 Laravel 5.7 中使用验证 uuid 方法有问题的人,我通过更新 Laravel 进行了修复(在更新 5.7.28 之后是 5.7.6)并且它起作用了!
是否有内置的方法来使用验证规则来验证 UUID?我在“Available Validation Rules”文档中没有找到任何相关信息。
您可以在 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);
});
引用此 post: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);
});
希望这符合您的要求。
Laravel 5.6 现在提供开箱即用的 ramesey/uuid 包。 您现在可以使用其 "isValid" 方法来检查 UUID。我注意到上面解决方案中的正则表达式有时会失败。 Laravel 内部使用的包我还没有遇到任何问题。
Validator::extend('uuid', function ($attribute, $value, $parameters, $validator) {
return \Ramsey\Uuid\Uuid::isValid($value);
});
与问题无关,但您现在也可以使用 Laravel 中的 "Str" class 生成 UUID。这就是现在默认包含 ramsey/uuid 的原因,无需包含您自己的正则表达式。
\Illuminate\Support\Str::uuid();
实际上,Laravel 5.7支持UUID验证。
$validation = $this->validate($request, [
'uuid_field' => 'uuid'
]);
Laravel 5.7 UUID 验证由于某种原因无法正常工作。至少我得到
InvalidArgumentException: validation.uuid.
解决此问题的最佳方法是创建规则。
php artisan make:rule UUID
这是我的 UUID 验证规则 class:
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']
];
}
}
对于那些在 Laravel 5.7 中使用验证 uuid 方法有问题的人,我通过更新 Laravel 进行了修复(在更新 5.7.28 之后是 5.7.6)并且它起作用了!