spatie / laravel-validation-rules
一组有用的 Laravel 验证规则
Requires
- php: ^8.0
- illuminate/support: ^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- laravel/pint: ^1.3
- league/iso3166: ^3.0|^4.3
- myclabs/php-enum: ^1.6
- orchestra/testbench: ^6.23|^7.0|^8.0|^9.0
- pestphp/pest: ^1.23|^2.6
- spatie/enum: ^2.2|^3.0
Suggests
- league/iso3166: Needed for the CountryCode rule and Currency rule
README
此仓库包含一些有用的 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 国家代码(有效国家代码示例: GB
,DK
,NL
)。
注意,此规则需要安装包 league/iso3166
: composer require league/iso3166
// in a `FormRequest` use Spatie\ValidationRules\Rules\CountryCode; public function rules() { return [ 'country_code' => ['required', new CountryCode()], ]; }
如果您想验证可空的国家代码字段,可以在 CountryCode
规则上调用 nullable()
方法。这样 null
和 0
也可以通过值
// in a `FormRequest` use Spatie\ValidationRules\Rules\CountryCode; public function rules() { return [ 'country_code' => [(new CountryCode())->nullable()], ]; }
Currency
确定验证的字段是否是有效的 3 位 ISO4217 货币代码(有效货币示例: EUR
,USD
,CAD
)。
注意,此规则需要安装包 league/iso3166
: composer 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/enum或myclabs/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
包含ADMIN
或REVIEWER
时,请求才有效。
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)。请参阅许可证文件获取更多信息。