引言:
Laravel提供了Validator模块,可解决表单提交验证等一些需求,并且可以在视图View中显示错误验证信息,交互还是很友好的。注明:作者水平有限,有错误或建议请指正,轻拍。
概述:
Laravel中在Controller.php文件中引用了trait为ValidatesRequests,这个trait源码在/Illuminate/Foundation/Validation/ValidatesRequests.php,源码文件中主要包含了两个共有方法:validate()和validateWithBag(),有时间可以浏览浏览。。
(一)、post表单提交,并在视图中显示验证错误信息
1、先在routes.php中写两个路由:
代码语言:javascript复制 Route::get('laravel/test/validator', 'PHPTestController@getValidator');
Route::post('laravel/test/validator', 'PHPTestController@postValidator');
PHPTestController可由php artisan make:controller PHPTestController
这个Laravel自带的artisan命令来创建。
在PHPTestController控制器中写上getValidator方法:
public function getValidator(){
return view('validator.validator');
}
2、写表单视图页面
该方法直接返回一个表单提交页面,表单提交页面视图代码为,文件路径为resources/validator/validator.blade.php:
代码语言:javascript复制 <html>
<head>
<title>Laravel Validator Test</title>
<link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-12">
<form action="{{url('laravel/test/validator')}}" method="POST">
<legend style="text-align: center">表单提交</legend>
<legend style="text-align: center">Person</legend>
<label style="margin-left: 50%">Name</label>
<input type="text" name="name">
<label style="margin-left: 50%">Age</label>
<input type="text" name="age">
<button type="submit" class="btn btn-success">Submit</button>
</form>
</div>
</div>
</div>
<script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
<script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</body>
</html>
在浏览器中访问http://XXX/laravel/test/validator
这个路由,其中XXX为你的host,可以是虚拟的host也可以是你的共有域名,则表单提交页面为:
3、写表单提交控制器
然后写上表单提交方法postValidator:
代码语言:javascript复制 public function postValidator(Request $request){
// $tmp = $request->get('name');
// return $tmp;
$this->validate($request, [
'name' => 'required',
'age' => 'required|integer',
]);
dd('form post success!!!');
}
填写表单,name="name"和age="age",点击提交按钮,没有打印"form post success!!!"
;填写name="name"和age="18",打印"form post success!!!"
,说明验证模块已经工作了,但页面没有显示验证错误信息。
4、写显示验证错误信息视图
在laravel中,laravel会在每次请求把errors变量刷到session中,和视图模板绑定,所以errors变量在视图模板中可用,官方文档原话:"So, it is important to note that an
代码语言:javascript复制 @if(count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach($errors->all() as $error)
<li>{{$error}}</li>
@endforeach
</ul>
</div>
@endif
可在</form>结束标签后加上上面的代码,$errors实际上是IlluminateSupportMessageBag
的实例对象,MessageBag类里比较好用的几个方法如all()/get()/first()/has()
等等,现在重新提交表单:
在表单页面就会显示验证的错误信息!!!
5、定制显示错误信息
错误信息是由laravel默认的,如果自定义显示错误信息,如:
代码语言:javascript复制 public function postValidator(Request $request){
// $tmp = $request->get('name');
// return $tmp;
$this->validate($request, [
'person.*.name' => 'required',
'person.*.age' => 'required|integer',
], ['person.*.name.required' => 'Required!!!']);
dd('form post success!!!');
}
只需要在validate(*)方法中加上$message[]参数就行,如代码中['person.*.name.required' => 'Required']
,简单方便。
如果针对对于多个页面的person.*.name都写同样的错误显示信息,可以在resources/lang/en/validation.php
文件中做定制:
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
'person.*.name' => [
'required' => 'Required!!!',
],
'person.*.age' => [
'required' => 'Age must be required!!!',
// 'min' => 'Age must be over 18!!!',
],
],
注意:
如果显示$errors变量不存在等错误,这主要是在app/Http/Kernel.php文件中,把IlluminateSessionMiddlewareStartSession::class,IlluminateViewMiddlewareShareErrorsFromSession::class,
从web中加到全局中间件$middleware中,或者
在你写路由的时候加上web中间件:
Route::group(['middleware'=>'web'], function(){
Route::get('laravel/test/validator','PHPTestController@getValidator');
Route::post('laravel/test/validator', 'PHPTestController@postValidator');
});
(二)、验证数组形式表单
有时候在写表单时,需要同时输入相类似的表单输入时,可以把这些input作为数组看待,laravel5.2也提供了数组形式的验证,可以利用一个小demo看下。
1、重写下表单提交页面
修改下validator.blade.php中代码:
代码语言:javascript复制 <legend style="text-align: center">表单提交</legend>
<legend style="text-align: center">Person</legend>
<label style="margin-left: 50%">Name</label>
<input type="text" name="person[1][name]">
<label style="margin-left: 50%">Age</label>
<input type="text" name="person[1][age]">
<label style="margin-left: 50%">Name</label>
<input type="text" name="person[2][name]">
<label style="margin-left: 50%">Age</label>
<input type="text" name="person[2][age]">
<label style="margin-left: 50%">Name</label>
<input type="text" name="person[3][name]">
<label style="margin-left: 50%">Age</label>
<input type="text" name="person[3][age]">
<button type="submit" class="btn btn-success">Submit</button>
2、重写下表单提交控制器
修改下postValidator(*)方法:
代码语言:javascript复制 public function postValidator(Request $request){
// $tmp = $request->get('name');
// return $tmp;
$this->validate($request, [
'person.*.name' => 'required',
'person.*.age' => 'required|integer',
]);
dd('form post success!!!');
}
不填写输入直接提交表单,错误信息显示:
或者
(三)、定制一个表单请求类,把验证规则从控制中抽取出来
有时候,把验证规则逻辑单独放在一个类里,使得控制器代码更加简约。laravel提供了php artisan make:request TestValidatorRequest
命令来创建一个单独类存放验证规则,生成的TestValidatorRequest.php文件存放在app/Http/Requests文件夹下。该存储类主要有两个重要方法:authorize()和rules()
。
1、在TestValidatorRequest类里写验证规则
authorize()方法主要用来设置用户权限,返回false时会返回一个403并且控制器代码不能执行,如没有权限的用户不能提交表单。这里直接把该方法源代码改为return true
。
rules()方法里主要写表单验证规则,在这里把控制器中postValidator()方法的规则抽取出来放在这里:
return [
'person.*.name'=>'required',
'person.*.age'=>'required|integer'
];
2、重写控制器中postValidator(*)方法
直接把TestValidatorRequest依赖注入进postValidator(*),这样laravel会自动验证规则:
代码语言:javascript复制 public function postValidator(TestValidatorRequest $request){
//业务逻辑
dd('form post success!!!');
}
One more thing...
一个好用的PHP调试函数:debug_backtrace()
,在laravel任意一个文件如自己创建的PHPTestController
控制器的postValidator()
函数中加上一句:
var_dump(debug_backtrace());die();
会打印程序执行流程,看不清楚显示网页源代码看看,效率小神器。