引言
从请求对象Request创建之后,系统开始接收用户输入数据,设计程序记住一条,永远不要相信用户的输入。你永远也想不到,用户会把什么样稀奇古怪的数据提交上来。
作为最重要的一道门槛,验证器Validator这个保安员的工作至关重要,本期就来说一说。
代码时间
假设web端有两个路由,定义在route/web.php文件内:
Route::get('recipes/create','RecipesController@create');
Route::post('recipes','RecipesController@store');
get请求,用于展示一个前端空白表单,给用户输入;post请求,用于更新配方数据,接收前端来的表单数据,需要写入数据库。
我们首先使用 Request 继承的 validate 方法,直接调用验证器方法, 在控制器内实现验证逻辑的代码。首先看get请求对应的方法:
publicfunctioncreate(){
returnview('recipes.create');}
这个就是一个视图展示,blade页面组织好表单就可以了。
重要的看一下post方法接收数据后的处理;
publicfunctionstore(Request$request){
$this->validate($request,[
'title'=>'required|unique:recipes|max:125',
'body'=>'required'
]);
// Recipe 有效,继续其他逻辑
}
简化模型,只针对两个字段title body进行验证。说一下几个验证规则的意义:
required 必填
unique 唯一性,要求再recipes表内,title字段唯一。如果存在则验证不通过。
max 字符串长度最大125
上面这个是使用了Request继承的验证方法,如果我们手动构造验证规则,如何做呢?其实, laravel提供的Validator对象,提供了众多的验证规则,验证方法,验证逻辑,只要我们进行手动实例化, 对传入的数据按规则进行整理,即可使用其特性。
为方便演示,我们在路由内直接构造。首先还是get视图路由:
Route::get('recipes/create',function(){
returnview('recipes.create');
});
接着是表单提交的路由:
Route::post('recipes',function(Illuminate\Http\Request$request){
$validator=Validator::make($request->all(),[
'title'=>'required|unique:recipes|max:125',
'body'=>'required'
]);
if($validator->fails()){
returnredirect('recipes/create')->withErrors($validator)->withInput();
}
// Recipe 有效,继续其他逻辑
});
验证规则是统一的,上面我们已经介绍了。大家重点看一下,这里我们使用的是
Validator::make();
方法实例化验证器,并传入验证规则。而传入的需要验证的数据,使用的是
$request->all()
也就是请求体格式化之后的数组,接着对象 $validator 就可以调用验证器的方法处理了。
在验证失败时,直接进行了重定向的返回。其中redirect方法返回一个\Illuminate\Http\RedirectResponse对象实例,withErrors,withInput,是对象的方法,用于传递错误数据。
要手动在视图文件内展示验证错误信息,可以这样使用:
@if($errors->any())
@foreach($errors->all()as$error)
@endforeach
@endif
上面这些方法允许我们在程序内任意位置调用验证,但是逻辑写起来会有些杂乱, 有没有可能把通用的验证规则拿出来,统一进行验证呢?这样单独多出来一层逻辑, 用于专门的验证,代码结构岂不是简洁的多?
我们可以这样创建验证器:
php artisan make:request CreateCommentRequest
接下来在该验证文件内实现以下逻辑:
我们实现了两个方法,一个是authorize方法,用于判断用户是否有权限使用该验证器;一个是rules方法,返回一个由验证规则组成的数组。
声明之后在程序内调用,比如在路由内:
Route::post('comments',function(App\Http\Requests\CreateCommentRequest$request){
// 验证通过,处理数据
})
这样代码的可读性就强的多了。
写在最后
本文通过一个post表单数据的验证,使用了多种验证方法,以满足场景需求。对于通用的验证规则, 如果能够提取出来,建议将其独立出来进行使用。这样自定义的方法较为灵活可扩展。
Happy coding :-)
我是@程序员小助手,持续分享编程知识,欢迎关注。
领取专属 10元无门槛券
私享最新 技术干货