Laravel学习教程之request validation的编写


Posted in PHP onOctober 25, 2017

前言

本文主要给大家介绍了关于Laravel之request validation编写的相关内容,在用laravel写api时,当前端传进来的request是POST/PUT/PATH等method时,那需要做request validation,尽管对于前后端分离程序,前端程序Angular/Vue已经做了validation,但是ajax传过来的json input,在后端也需要做validation。

那该如何优雅的编写request validation呢?laravel官方文档已经包含了这个feature: Form Request Validation

实现方法如下

这里可以写一个JsonRequest:

class JsonRequest extends Illuminate\Foundation\Http\FormRequest
{
 public function rules()
 {
  $method = $this->method();
  
  assert(in_array($method, [static::METHOD_POST, static::METHOD_PUT, static::METHOD_PATCH], true));
  
  $controller = $this->route()->getController();
  $rules  = $controller::RULES;

  return ($rules[$this->method()] ?? []) + ($rules['*'] ?? []);
 }

 public function authorize()
 {
  return true;
 }
}

这样就可以在众多Model Controller里使用JsonRequest就行,如:

use Illuminate\Http\Request;

final class AccountController extends \App\Http\Controllers\Controller
{
 public const RULES = [
  Request::METHOD_POST => [
   'bank_account' => 'required_if:type,bank',
   'loan_account' => 'required_if:type,loan',
  ],
  Request::METHOD_PUT => [
   // ...
  ],
  '*' => [
   // ...
  ],
 ];
}

这样就可以校验前端传进来的json input是否合法。

(1)如果前端传进来的json input是:

{
 "name": "lx1036",
 "type": "loan",
 "bank_account": {
  "source": "bank",
 }
}

那就validation失败,不合法。

(2) 如果前端传进来的json input是:

{
 "name": "lx1036",
 "type": "bank",
 "loan_account": {
  "source": "loan",
 }
}

那就validation失败,不合法。

这样就可以校验json input,不合法就直接弹回throw 一个HttpException,不再用在进入下一步逻辑。对于这样嵌套的json input,使用request validation来校验对象间关系很重要,可以看做是进入核心业务逻辑前的初步校验。。当然最后写表时还有model validation,避免坏数据进入db。

最后一点,laravel文档只是说了用法,没有说明原理。代码在\Illuminate\Foundation\Providers\FormRequestServiceProvider::class:

public function boot()
 {
  // \Illuminate\Foundation\Http\FormRequest use 了 ValidatesWhenResolvedTrait,extends 了 \Illuminate\Contracts\Validation\ValidatesWhenResolved
  $this->app->afterResolving(ValidatesWhenResolved::class, function ($resolved) {
   $resolved->validate();
  });

  // ...
 }

所以当从容器中resolve完\Illuminate\Foundation\Http\FormRequest后就会立即执行\Illuminate\Foundation\Http\FormRequest::validate()方法,具体不详述,可看laravel源码。

OK,总之,在写程序时,validation很重要,需要去写,包括request validation和model validation。。。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
用Php实现链结人气统计
Oct 09 PHP
网站当前的在线人数
Oct 09 PHP
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
Mar 28 PHP
PHP 创建文件(文件夹)以及目录操作代码
Mar 04 PHP
Discuz!下Memcache缓存实现方法
May 28 PHP
PHP日期处理函数 整型日期格式
Jan 12 PHP
PHP 使用MySQL管理Session的回调函数详解
Jun 21 PHP
10个简化PHP开发的工具
Dec 25 PHP
PHP如何将XML转成数组
Apr 04 PHP
PHP图片加水印实现方法
May 06 PHP
PHP使用PDO抽象层获取查询结果的方法示例
May 10 PHP
基于laravel缓冲cache的用法详解
Oct 23 PHP
Yii2框架实现登录、退出及自动登录功能的方法详解
Oct 24 #PHP
Yii2.0实现生成二维码功能实例
Oct 24 #PHP
完美的php分页类
Oct 24 #PHP
PHP设计模式之工厂模式详解
Oct 24 #PHP
2017年最好用的9个php开发工具推荐(超好用)
Oct 23 #PHP
thinkPHP5实现的查询数据库并返回json数据实例
Oct 23 #PHP
php实现的后台表格分页功能示例
Oct 23 #PHP
You might like
一首老MP3,致敬WAR3经典
2021/03/08 魔兽争霸
BBS(php & mysql)完整版(三)
2006/10/09 PHP
php调整服务器时间的方法
2015/04/03 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
PHP 记录访客的浏览信息方法
2018/01/29 PHP
用脚本调用样式的几种方法
2006/12/09 Javascript
使用新的消息弹出框blackbirdjs
2008/10/16 Javascript
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
2013/02/18 Javascript
js兼容的placeholder属性详解
2013/08/18 Javascript
js中精确计算加法和减法示例
2014/03/28 Javascript
浅谈JS原型对象和原型链
2016/03/02 Javascript
Bootstrap学习笔记之环境配置(1)
2016/12/07 Javascript
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
js实现可以点击收缩或张开的悬浮窗
2017/09/18 Javascript
vue发送websocket请求和http post请求的实例代码
2019/07/11 Javascript
解决layui下拉框监听问题(监听不到值的变化)
2019/09/28 Javascript
js实现GIF动图分解成多帧图片上传
2019/10/24 Javascript
vue实现带过渡效果的下拉菜单功能
2020/02/19 Javascript
vue项目或网页上实现文字转换成语音播放功能
2020/06/09 Javascript
js实现纯前端压缩图片
2020/11/16 Javascript
[01:00:53]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Secret
2018/03/30 DOTA
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
Ray-Ban雷朋太阳眼镜英国官网:Ray-Ban UK
2019/11/23 全球购物
日语翻译个人求职的自我评价
2013/10/14 职场文书
迷你西餐厅创业计划书范文
2013/12/31 职场文书
大学班长的职责
2014/01/27 职场文书
关于是否需要写商业计划书
2014/02/07 职场文书
党员年终个人总结
2015/02/14 职场文书
2015年度酒店客房部工作总结
2015/05/25 职场文书
2015年小学生暑假总结
2015/07/13 职场文书
2016年第二十五次全国助残日活动总结
2016/04/01 职场文书
党组织关系的介绍信模板
2019/06/21 职场文书
Android自定义双向滑动控件
2022/04/19 Java/Android