使用Laravel验证验证UUID

时间:2017-10-11 07:41:32

标签: php laravel laravel-5 laravel-5.5

是否存在使用验证规则验证UUID的内置方法?我在“Available Validation Rules”文档中没有发现任何相关内容。

5 个答案:

答案 0 :(得分:8)

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();

答案 1 :(得分: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);
});

希望这符合您的要求。

答案 2 :(得分:0)

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

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

基于documentation

答案 3 :(得分: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']
        ];
    }
}

答案 4 :(得分:0)

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