验证 图片验证 在验证上传的图片时,可以指定所需的尺寸
1 ['photo' => 'dimensions:max_width=4096,max_height=4096' ]
自定义验证错误的信息 只需在 resources/lang/xx/validation.php 文件创建适当的数组结构,就可以定义定每个 字段、规则和语言的验证错误消息。
1 2 3 4 5 'custom' => [ 'email' => [ 'required' => 'We need to know your e-mail address!' , ], ],
用now或yesterday来验证日期 您可以使用 before/after 的规则验证日期,并将各种字符串作为参数传递,比如: tomorrow, now, yesterday。例如: 'start_date' => 'after:now'。它在底层下使用 strtotime ()。
1 2 3 4 $rules = [ 'start_date' => 'after:tomorrow' , 'end_date' => 'after:start_date' ];
具有某些条件的验证规则 如果验证规则依赖于某些条件,则可以通过将 withValidator() 添加到 FormRequest 类中来修改规则,并在那里指定自定义逻辑。例如,如果您只想为某些用户角色添加验证规则。
1 2 3 4 5 6 7 8 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类中。
1 2 3 4 5 6 7 8 9 10 11 12 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 ()
1 2 3 4 5 6 protected function prepareForValidation ( ) { $this ->merge([ 'slug' => Illuminate\Support\Str::slug($this ->slug), ]); }
第一次验证错误时停止 默认情况下,将在列表中返回 Laravel 验证错误,检查所有验证规则。但是如果你想要在第一个错误之后停止这个过程,使用验证规则叫做 bail:
1 2 3 4 $request ->validate([ 'title' => 'bail|required|unique:posts|max:255' , 'body' => 'required' , ]);
如果你需要停止首次错误验证,可以设置FormRequest 类中$stopOnFirstFailure为true:
1 protected $stopOnFirstFailure = true ;
如果您不使用 validate() 或 Form Request,但仍然需要使用相同的 422 状态码和错误结构抛出错误,那么可以手动抛出 throw ValidationException::withMessages()
1 2 3 4 5 if (! $user || ! Hash::check($request ->password, $user ->password)) { throw ValidationException::withMessages([ 'email' => ['The provided credentials are incorrect.' ], ]); }
规则取决于其他条件 如果您的规则是动态的并且依赖于其他条件,那么您可以动态地创建该规则数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 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规则不一样 只在单个规则失败时就停止
1 2 3 4 5 6 protected $stopOnFirstFailure = true ;
unique规则在软删除全局作用域中无效 Rule::unique 默认不在软删除的全局范围内。但是使用withoutTrashed` 时可用。
1 Rule::unique('users' , 'email' )->withoutTrashed();
sometimes方法允许你定义验证器在什么时候被应用 Validator::sometimes 方法允许你定义验证器在什么时候被应用,基于提供的输入。 这个片段展示了如果购买的物品数量不够,如何禁止使用优惠券。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 $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 ; }); $validator ->validate();
数组元素验证 如果你想要验证提交的数组元素,使用带*号的点符号。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 $request ->validated()->user_info = [ [ 'name' => 'Qasim' , 'age' => 26 , ], [ 'name' => 'Ahmed' , 'age' => 23 , ], ]; $rules = [ 'user_info.*.name' => ['required' , 'alpha' ], 'user_info.*.age' => ['required' , 'numeric' ], ];
由HydroMoon 提供
提交自定义验证规则 感谢Rule::when 我们可以指定提交验证规则。
下面例子我们可以验证用户是否真的可以对文章点赞。
1 2 3 4 5 6 7 8 use Illuminate \Validation \Rule ;public function rules ( ) { return [ 'vote' => Rule::when($user ->can('vote' , $post ), 'required|int|between:1,5' ), ] }
Password的defaults方法 使用Password::defaults方法验证用户提供的密码时,可以强制执行特定规则。它包括要求字母、数字、符号等的选项。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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的属性即可
Link to docs
Mac验证规则 Laravel 8.77添加了新的mac_address规则
1 2 3 $trans = $this ->getIlluminateArrayTranslator();$validator = new Validator($trans , ['mac' => '01-23-45-67-89-ab' ], ['mac' => 'mac_address' ]);$this ->assertTrue($validator ->passes());
验证顶级域名邮箱 email验证规则将接受一个非顶级域名邮箱 (例子:taylor@laravel, povilas@ldaily)
但是你如果想确保邮箱必须有一个顶级域名 (例子:taylor@laravel.com, povilas@ldaily.com) 使用email:filter规则
1 2 3 4 [ 'email' => 'required|email' , 'email' => 'required|email:filter' , ],