⬆️ 回到顶部 ⬅️ 上一个 (路由) ➡️ 下一个 (集合)
- 图片验证
- 自定义验证错误的信息
- 用now或yesterday来验证日期
- 具有某些条件的验证规则
- 更改默认验证消息
- 预验证
- 第一次验证错误时停止
- 不使用validate或者FormRequest就抛出422
- 规则取决于其他条件
- 使用属性设置首次验证失败时停止
- unique规则在软删除全局作用域中无效
- sometimes方法允许你定义验证器在什么时候被应用
- 提交自定义验证规则
- 数组元素验证
- Password的defaults方法
- 表单验证重定向请求
- Mac验证规则
- 验证顶级域名邮箱
在验证上传的图片时,可以指定所需的尺寸
['photo' => 'dimensions:max_width=4096,max_height=4096']
只需在 resources/lang/xx/validation.php
文件创建适当的数组结构,就可以定义定每个 字段、规则和语言的验证错误消息。
'custom' => [
'email' => [
'required' => 'We need to know your e-mail address!',
],
],
您可以使用 before/after
的规则验证日期,并将各种字符串作为参数传递,比如: tomorrow
, now
, yesterday
。例如: 'start_date' => 'after:now'
。它在底层下使用 strtotime ()
。
$rules = [
'start_date' => 'after:tomorrow',
'end_date' => 'after:start_date'
];
如果验证规则依赖于某些条件,则可以通过将 withValidator()
添加到 FormRequest
类中来修改规则,并在那里指定自定义逻辑。例如,如果您只想为某些用户角色添加验证规则。
use Illuminate\Validation\Validator;
class StoreBlogCategoryRequest extends FormRequest {
public function withValidator(Validator $validator) {
if (auth()->user()->is_admin) {
$validator->addRules(['some_secret_password' => 'required']);
}
}
}
如果要更改特定字段和特定验证规则的默认验证错误消息,只需将 messages()
方法添加到FormRequest
类中。
class StoreUserRequest extends FormRequest
{
public function rules()
{
return ['name' => 'required'];
}
public function messages()
{
return ['name.required' => 'User name should be real name'];
}
}
如果你想在默认的Laravel
验证之前修改某个字段,或者,换句话说,“准备” 那个字段, FormRequest
类中有一个方法 prepareForValidation ()
protected function prepareForValidation()
{
$this->merge([
'slug' => Illuminate\Support\Str::slug($this->slug),
]);
}
默认情况下,将在列表中返回 Laravel 验证错误,检查所有验证规则。但是如果你想要在第一个错误之后停止这个过程,使用验证规则叫做 bail:
$request->validate([
'title' => 'bail|required|unique:posts|max:255',
'body' => 'required',
]);
如果你需要停止首次错误验证,可以设置FormRequest
类中$stopOnFirstFailure
为true
:
protected $stopOnFirstFailure = true;
如果您不使用 validate()
或 Form Request
,但仍然需要使用相同的 422
状态码和错误结构抛出错误,那么可以手动抛出 throw ValidationException::withMessages()
if (! $user || ! Hash::check($request->password, $user->password)) {
throw ValidationException::withMessages([
'email' => ['The provided credentials are incorrect.'],
]);
}
如果您的规则是动态的并且依赖于其他条件,那么您可以动态地创建该规则数组
public function store(Request $request)
{
$validationArray = [
'title' => 'required',
'company' => 'required',
'logo' => 'file|max:2048',
'location' => 'required',
'apply_link' => 'required|url',
'content' => 'required',
'payment_method_id' => 'required'
];
if (!Auth::check()) {
$validationArray = array_merge($validationArray, [
'email' => 'required|email|unique:users',
'password' => 'required|confirmed|min:5',
'name' => 'required'
]);
}
//
}
在request
类中使用这个属性设置首次验证失败时停止。
注意 这个跟 Bail
规则不一样 只在单个规则失败时就停止
/**
* Indicated if the validator should stop
* the entire validation once a single
* rule failure has occurred.
*/
protected $stopOnFirstFailure = true;
由 @Sala7JR提供
Rule::unique
默认不在软删除的全局范围内。但是使用
withoutTrashed` 时可用。
Rule::unique('users', 'email')->withoutTrashed();
由 @Zubairmohsin33提供
Validator::sometimes
方法允许你定义验证器在什么时候被应用,基于提供的输入。
这个片段展示了如果购买的物品数量不够,如何禁止使用优惠券。
$data = [
'coupon' => 'PIZZA_PARTY',
'items' => [
[
'id' => 1,
'quantity' => 2
],
[
'id' => 2,
'quantity' => 2,
],
],
];
$validator = Validator::make($data, [
'coupon' => 'exists:coupons,name',
'items' => 'required|array',
'items.*.id' => 'required|int',
'items.*.quantity' => 'required|int',
]);
$validator->sometimes('coupon', 'prohibited', function (Fluent $data) {
return collect($data->items)->sum('quantity') < 5;
});
// throws a ValidationException as the quantity provided is not enough
$validator->validate();
Tip given by @cerbero90
如果你想要验证提交的数组元素,使用带*
号的点符号。
// say you have this array
// array in request 'user_info'
$request->validated()->user_info = [
[
'name' => 'Qasim',
'age' => 26,
],
[
'name' => 'Ahmed',
'age' => 23,
],
];
// Rule
$rules = [
'user_info.*.name' => ['required', 'alpha'],
'user_info.*.age' => ['required', 'numeric'],
];
由HydroMoon提供
感谢Rule::when
我们可以指定提交验证规则。
下面例子我们可以验证用户是否真的可以对文章点赞。
use Illuminate\Validation\Rule;
public function rules()
{
return [
'vote' => Rule::when($user->can('vote', $post), 'required|int|between:1,5'),
]
}
由 @cerbero90提供
使用Password::defaults
方法验证用户提供的密码时,可以强制执行特定规则。它包括要求字母、数字、符号等的选项。
class AppServiceProvider
{
public function boot(): void
{
Password::defaults(function () {
return Password::min(12)
->letters()
->numbers()
->symbols()
->mixedCase()
->uncompromised();
})
}
}
request()->validate([
['password' => ['required', Password::defaults()]]
])
使用表单请求进行验证时,默认情况下,验证错误将重定向回上一页,但您可以覆盖它
只需定义$redirect
或redirectRoute
的属性即可
Laravel 8.77
添加了新的mac_address
规则
$trans = $this->getIlluminateArrayTranslator();
$validator = new Validator($trans, ['mac' => '01-23-45-67-89-ab'], ['mac' => 'mac_address']);
$this->assertTrue($validator->passes());
[@Teacoders] 提供
email
验证规则将接受一个非顶级域名邮箱 (例子:taylor@laravel
, povilas@ldaily
)
但是你如果想确保邮箱必须有一个顶级域名 (例子:taylor@laravel.com
, povilas@ldaily.com
) 使用email:filter
规则
[
'email' => 'required|email', // before
'email' => 'required|email:filter', // after
],