首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

3分钟短文:Laravel验证用户输入,不要把啥都存到系统里

引言

从请求对象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 :-)

我是@程序员小助手,持续分享编程知识,欢迎关注。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200914A046MC00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券