spatie/laravel-validation-rules

一组有用的 Laravel 验证规则

资助包维护!
spatie

安装数: 1,887,574

依赖者: 5

建议者: 0

安全: 0

星标: 736

关注者: 13

分支: 45

公开问题: 0

3.4.0 2024-03-02 05:57 UTC

README

Latest Version on Packagist Tests Total Downloads

此仓库包含一些有用的 Laravel 验证规则。

支持我们

我们投入了大量资源来创建一流的开放源代码包。您可以通过购买我们的付费产品之一来支持我们。

我们非常感谢您从家乡寄来明信片,注明您正在使用我们哪些包。您可以在我们的联系页面上找到我们的地址。我们将所有收到的明信片发布在我们的虚拟明信片墙上

安装

您可以通过 composer 安装此包

composer require spatie/laravel-validation-rules

该包将自动注册自己。

翻译

如果您想编辑包的翻译,您可以运行以下命令将其发布到您的 resources/lang 文件夹

php artisan vendor:publish --provider="Spatie\ValidationRules\ValidationRulesServiceProvider"

可用规则

授权

确定用户是否有权对给定模型实例执行能力。模型的 id 是验证的字段

考虑以下策略

class ModelPolicy
{
    use HandlesAuthorization;

    public function edit(User $user, Model $model): bool
    {
        return $model->user->id === $user->id;
    }
}

如果登录用户的 id 与请求中 model_id 键的 TestModel 上的 user_id 匹配,则此验证规则将通过。

// in a `FormRequest`

use Spatie\ValidationRules\Rules\Authorized;

public function rules()
{
    return [
        'model_id' => [new Authorized('edit', TestModel::class)],
    ];
}

可选地,您可以为第三个参数提供一个身份验证守卫。

new Authorized('edit', TestModel::class, 'guard-name')

模型解析

如果您在您的模型中实现了 getRouteKeyName 方法,它将用于解析模型实例。更多信息请参阅 自定义默认键名

CountryCode

确定验证的字段是否是有效的 2 位 ISO3166 国家代码(有效国家代码示例: GBDKNL)。

注意,此规则需要安装包 league/iso3166composer require league/iso3166

// in a `FormRequest`

use Spatie\ValidationRules\Rules\CountryCode;

public function rules()
{
    return [
        'country_code' => ['required', new CountryCode()],
    ];
}

如果您想验证可空的国家代码字段,可以在 CountryCode 规则上调用 nullable() 方法。这样 null0 也可以通过值

// in a `FormRequest`

use Spatie\ValidationRules\Rules\CountryCode;

public function rules()
{
    return [
        'country_code' => [(new CountryCode())->nullable()],
    ];
}

Currency

确定验证的字段是否是有效的 3 位 ISO4217 货币代码(有效货币示例: EURUSDCAD)。

注意,此规则需要安装包 league/iso3166composer require league/iso3166

// in a `FormRequest`

use Spatie\ValidationRules\Rules\Currency;

public function rules()
{
    return [
        'currency' => ['required', new Currency()], // Must be present and a valid currency
    ];
}

如果您想验证可空的货币字段,请按照 Laravel 文档中关于隐式验证规则中描述的方式不要让它成为必填项

... 当验证的属性不存在或包含空字符串时,包括自定义规则在内的所有常规验证规则都不会运行

// in a `FormRequest`

use Spatie\ValidationRules\Rules\Currency;

public function rules()
{
    return [
        'currency' => [new Currency()], // This will pass for any valid currency, an empty value or null
    ];
}

Enum

此规则将验证正在验证的值是否属于给定的枚举类。我们假设枚举类有一个静态的toArray方法,该方法返回所有有效值。如果您正在寻找一个好的枚举类,可以看看spatie/enummyclabs/php-enum

考虑以下枚举类:

class UserRole extends MyCLabs\Enum\Enum
{
    const ADMIN = 'admin';
    const REVIEWER = 'reviewer';
}

可以使用如下方式使用Enum规则:

// in a `FormRequest`

use Spatie\ValidationRules\Rules\Enum;

public function rules()
{
    return [
        'role' => [new Enum(UserRole::class)],
    ];
}

只有当role包含ADMINREVIEWER时,请求才有效。

ModelsExist

确定输入数组中的所有值是否作为给定模型类的属性存在。

默认情况下,该规则假定您希望使用id属性进行验证。在下面的示例中,如果所有model_ids对于Model都存在,验证将通过。

// in a `FormRequest`

use Spatie\ValidationRules\Rules\ModelsExist;

public function rules()
{
    return [
        'model_ids' => ['array', new ModelsExist(Model::class)],
    ];
}

您还可以将属性名称作为第二个参数传递。在下面的示例中,如果请求中的user_emails中每个电子邮件都有对应的用户,验证将通过。

// in a `FormRequest`

use Spatie\ValidationRules\Rules\ModelsExist;

public function rules()
{
    return [
        'user_emails' => ['array', new ModelsExist(User::class, 'emails')],
    ];
}

Delimited

此规则可以验证包含分隔值的字符串。构造函数接受一个用于验证所有单独值的规则。

以下是一个示例,我们将验证一个包含逗号分隔的电子邮件地址的字符串。

// in a `FormRequest`

use Spatie\ValidationRules\Rules\Delimited;

public function rules()
{
    return [
        'emails' => [new Delimited('email')],
    ];
}

以下是一些通过此规则的示例输入:

  • 'sebastian@example.com, alex@example.com'
  • ''
  • 'sebastian@example.com'
  • 'sebastian@example.com, alex@example.com, brent@example.com'
  • ' sebastian@example.com , alex@example.com , brent@example.com '

以下输入将不会通过:

  • '@example.com'
  • 'nocomma@example.com nocommatoo@example.com'
  • 'valid@example.com, invalid@'

设置最小值

您可以设置必须存在的最小项目数。

(new Delimited('email'))->min(2)
  • 'sebastian@example.com, alex@example.com' // 通过
  • 'sebastian@example.com' // 失败

设置最大值

(new Delimited('email'))->max(2)
  • 'sebastian@example.com' // 通过
  • 'sebastian@example.com, alex@example.com, brent@example.com' // 失败

允许重复项

默认情况下,如果发现重复项,则规则将失败。

  • 'sebastian@example.com, sebastian@example.com' // 失败

您可以像这样允许重复项:

(new Delimited('numeric'))->allowDuplicates()

现在这将通过: 1,1,2,2,3,3

自定义分隔符

(new Delimited('email'))->separatedBy(';')
  • 'sebastian@example.com; alex@example.com; brent@example.com' // 通过
  • 'sebastian@example.com, alex@example.com, brent@example.com' // 失败

跳过项的修剪

(new Delimited('email'))->doNotTrimItems()
  • 'sebastian@example.com,freek@example.com' // 通过
  • 'sebastian@example.com, freek@example.com' // 失败
  • 'sebastian@example.com , freek@example.com' // 失败

复合规则

验证器的构造函数接受一个验证规则字符串、一个验证实例或一个数组。

new Delimited('email|max:20')
  • 'short@example.com' // 通过
  • 'invalid' // 失败
  • 'loooooooonnnggg@example.com' // 失败

传递自定义错误消息

验证器的构造函数接受一个自定义错误消息数组作为第二个参数。

// in a `FormRequest`

use Spatie\ValidationRules\Rules\Delimited;

public function rules()
{
    return [
        'emails' => [new Delimited('email', $this->messages())],
    ];
}

public function messages()
{
    return [
        'emails.email' => 'Not all the given e-mails are valid.',
    ];
}

测试

composer test

变更日志

有关最近更改的更多信息,请参阅CHANGELOG

贡献

有关详细信息,请参阅CONTRIBUTING

安全

如果您发现有关安全性的错误,请通过security@spatie.be发送邮件,而不是使用问题跟踪器。

鸣谢

支持我们

Spatie是一家位于比利时的安特卫普的网页设计公司。您可以在我们的网站上找到所有开源项目的概述在这里

您的业务是否依赖于我们的贡献?在Patreon上与我们联系并支持我们。所有承诺都将用于分配人员以维护和开发新功能。

许可

麻省理工学院许可证(MIT)。请参阅许可证文件获取更多信息。