laravel笔记-验证
写在前面
时间可贵,善用目录↑
学习Laravel的笔记,仅仅是作为laravel文档笔记,目的是强化对文档的理解,质量不高。
什么是验证?
你前端不能一直只是页面跳来跳去吧,得有个表单啥的像后台提交点数据吧。
然后就是在哪验证,这个有很多种:
控制器中 $this->validate()
请求中rules()
在任何地方Validator::make()
如何验证
在控制器中
Laravel 的控制器基类使用ValidatesRequests trait,该trait提供了便利的方法通过各种功能强大的验证规则来验证输入的 HTTP 请求。
下面为一段控制器中的代码(一个方法):
/**
* 存储博客文章
*
* @param Request $request
* @return Response
*/
public function store(Request $request){
//验证请求,按顺序验证
$this->validate($request, [
// '参数名' => '规则1|规则2'
'title' => 'required|unique:posts|max:255',
//注意这里的bail,存在这个规则的验证向不通过时直接跳出不继续验证
'body' => 'bail|required',
//这里是对数组的验证,使用'.'解析
'author.name' => 'required',
'author.description' => 'required',
]);
// 验证通过,存储到数据库...
}
验证后如果出现错误,laravel会重定向到上一个页面并将错误信息全部存在session中。
处理错误信息
自定义错误格式
自定义保存在session中的验证错误信息的格式,需要在控制器基类中重写formatValidationErrors方法
不要忘了在该控制器类的顶部导入Illuminate\Contracts\Validation\Validator类
namespace App\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
abstract class Controller extends BaseController{
use DispatchesJobs, ValidatesRequests;
/**
* {@inheritdoc}
*/
protected function formatValidationErrors(Validator $validator)
{
return $validator->errors()->all();
}
}
在请求中
在一些情况下,我们可能需要定义一个’表单请求’来处理某些特定的请求。
使用验证
我们可以通过如下Artisan命令来自定义一个请求:
php artisan make:request StoreBlogPost
生成的类位于app/Http/Requests目录下,接下来我们添加少许验证规则到rules方法:
/**
* 获取应用到请求的验证规则
*
* @return array
*/
public function rules(){
return [
//规则同上文~
'title' => 'required|unique:posts|max:255',
'body' => 'required',
];
}
这样,只要在控制器中使用该类型的请求就可以自动验证了:
/**
* 存储输入的博客文章
*
* @param StoreBlogPostRequest $request
* @return Response
*/
public function store(StoreBlogPost $request){
// The incoming request is valid...
}
值得一说的是,在Request类中还有一个方法authorize()
,这个方法被用来验证检查认证用户是否有资格更新指定资源。
例如,用户要编辑一篇文章的评论,要验证评论的归属:
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
//这里Comment为评论的模型
$comment = Comment::find($this->route('comment'));
//判断是否有资格
return $comment && $this->user()->can('update', $comment);
}
Route::post('comment/{comment}');
处理错误信息
自定义错误格式
重写请求基类(App\Http\Requests\Request)中的formatErrors方法即可.
不要忘记在文件顶部导入Illuminate\Contracts\Validation\Validator类
/**
* {@inheritdoc}
*/
protected function formatErrors(Validator $validator){
return $validator->errors()->all();
}
自定义错误消息
重写messages方法自定义表单请求使用的错误消息.
/**
* Get the error messages for the defined validation rules.
*
* @return array
*/
public function messages(){
return [
'title.required' => 'A title is required',
'body.required' => 'A message is required',
];
}
使用Validator门面
使用验证
使用Validator门面的make方法,我们可以更加随意的验证信息。
比如:
/**
* 存储新的博客文章
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
//第一个参数是需要验证的数据,第二个参数是要应用到数据上的验证规则。
$validator = Validator::make($request->all(), [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
//满足$input->games不小于100时验证reason
$v->sometimes('reason', 'required|max:500', function($input) {
return $input->games >= 100;
});
//如果希望在验证完成后添加回调函数,使用after方法,如下
$validator->after(function($validator) {
if ($this->somethingElseIsInvalid()) {
$validator->errors()->add('field', 'Something is wrong with this field!');
}
});
//判断验证结果
if ($validator->fails()) {
//重定向
return redirect('post/create')
//将错误数据一次性存放到session,$errors会被填充
//withErrors()接收一个验证器、或一个MessageBag,或PHP数组
//如果一个页面有多个表单,可以传入第二个参数命名MessageBag
->withErrors($validator, 'login')
->withInput();
}
// 存储博客文章...
}
在view中我们可以这样获得:
{{ $errors->login->first('email') }}
如果希望自动重定向:
Validator::make($request->all(), [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
])->validate();
处理错误信息
调用Validator实例上的errors方法之后,将会获取一个Illuminate\Support\MessageBag实例,该实例中包含了多种处理错误信息的便利方法。在所有视图中默认有效的$errors变量也是一个MessageBag实例。
获取
//获取某字段的第一条错误信息
$messages = $validator->errors();
//获取某字段的所有错误信息
foreach ($messages->get('email') as $message) {
//
}
//获取数组字段的所有错误信息
foreach ($errors->get('attachments.*') as $message) {
//
}
//获取所有字段的所有错误信息
foreach ($messages->all() as $message) {
//
}
//判断消息中是否存在某字段的错误信息
if ($messages->has('email')) {
//
}
//获取指定格式的错误信息
echo $messages->first('email', '<p>:message</p>');
//获取指定格式的所有错误信息
foreach ($messages->all('<li>:message</li>') as $message) {
//
}
自定义错误信息
make方法的第三个参数可以自定义错误信息
$messages = [
//注意:':attribute'占位符会被验证的字段名替换。
'required' => 'The :attribute field is required.',
//对指定字段的指定错误设置信息
'email.required' => 'We need to know your e-mail address!',
];
$validator = Validator::make($input, $rules, $messages);
如何显示
在视图中,我们可以使用$errors变量来获得错误信息:
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
$errors变量是的一个Illuminate\Support\MessageBag实例,会通过web中间件组中的Illuminate\View\Middleware\ShareErrorsFromSession中间件绑定到视图~
关于AJAX
在AJAX请求中如果验证失败,Laravel不会生成重定向响应。取而代之的,Laravel生成一个包含验证错误信息的JSON响应。该JSON响应会带上一个HTTP状态码422。
验证规则
验证方式 | 意义 |
---|---|
accepted | 必须是yes、on、1或true,这在“同意服务协议”时很有用。 |
active_url | 该字段必须是一个基于PHP函数checkdnsrr 的有效URL |
after:date | 给定日期(字段)后的一个值,日期将会通过PHP函数strtotime传递 |
alpha | 该字段必须是字母 |
alpha_dash | 该字段可以包含字母和数字,以及破折号和下划线 |
alpha_num | 该字段必须是字母或数字 |
array | 该字段必须是PHP数组 |
before:date | 指定日期之前的一个数值,该日期将会传递给PHP strtotime函数。 |
between:min,max | 给定的最小值和最大值之间,字符串、数值和文件 |
boolean | 必须可以被转化为boolean,接收true, false, 1,0, “1”, 和 “0”等 |
confirmed | 必须有一个匹配字段foo_confirmation |
date | 验证字段必须是一个基于PHP strtotime函数的有效日期 |
date_format:format | 匹配指定格式 |
different:field | 验证字段必须是一个和指定字段不同的值 |
digits:value | 验证字段必须是数字且长度为value指定的值 |
digits_between:min,max | 验证字段数值长度必须介于最小值和最大值之间 |
dimensions | 图片尺寸’dimensions:min_width=100,min_height=200’ |
distinct | 验证字段不能包含重复值 |
验证字段必须是格式化的电子邮件地址 | |
exists:table,column | 验证字段必须存在于指定数据表 |
file | 该验证字段必须是上传成功的文件 |
filled | 该验证字段如果存在则不能为空 |
image | 验证文件必须是图片(jpeg、png、bmp、gif或者svg) |
in:foo,bar… | 验证字段值必须在给定的列表中 |
in_array:另一个字段 | 验证字段必须在另一个字段中存在 |
integer | 验证字段必须是整型 |
ip | 验证字段必须是IP地址 |
JSON | 验证字段必须是有效的JSON字符串 |
max:value | 验证字段必须小于等于最大值 |
mimetypes:text/plain… | 验证文件必须匹配给定的MIME文件类型之一 |
mimes:foo,bar,… | 验证文件的MIMIE类型必须是该规则列出的扩展类型中的一个 |
min:value | 验证字段的最小值 |
nullable | 验证字段必须为null |
not_in:foo,bar, | 验证字段值不在给定列表中 |
numeric | 验证字段必须是数值 |
present | 验证字段必须出现在输入数据中但可以为空 |
regex:pattern | 验证字段必须匹配给定正则表达式 |
required | 输入字段值不能为空 |
required_if:anotherfield,value | 另一个字段等于指定值value时是必须的 |
required_unless:anotherfield,value | 除了另一字段为value,验证字段不能空 |
required_with:foo,bar | 只有在任一其它指定字段存在的话才是必须的 |
required_with_all:foo,bar | 只有在所有指定字段存在的情况下才是必须的 |
required_without:foo,bar | 只有当任一指定字段不存在的情况下才是必须的 |
required_without_all: | 当所有指定字段不存在的情况下才是必须的 |
same:field | 给定字段和验证字段必须匹配 |
size:value | 和给定值value相匹配的尺寸 |
string | 验证字段必须是字符串 |
timezone | 基于PHP函数timezone_identifiers_list的有效时区标识 |
unique:table,column,except,idColumn | 给定数据表上必须是唯一的 |
url | 验证字段必须是基于PHP函数filter_var过滤的的有效URL |
老眼昏花了已经…….