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 相关文章推荐
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
Oct 09 PHP
PHP中redis的用法深入解析
Feb 20 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
Feb 14 PHP
十幅图告诉你什么是PHP引用
Feb 22 PHP
PHP在线书签系统分享
Jan 04 PHP
PHP模板引擎Smarty内建函数详解
Apr 11 PHP
php+webSoket实现聊天室示例代码(附源码)
Feb 17 PHP
PHP简单实现合并2个数字键数组值的方法
May 30 PHP
PDO操作MySQL的基础教程(推荐)
Aug 18 PHP
PHP去除空数组且数组键名重置的讲解
Feb 28 PHP
laravel框架实现去掉URL中index.php的方法
Oct 12 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
Oct 24 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
用PHP代码给图片加水印
2015/07/01 PHP
用jquery和json从后台获得数据集的代码
2011/11/07 Javascript
Javascript拓展String方法小结
2013/07/08 Javascript
JS文字球状放大效果代码分享
2015/08/19 Javascript
IE中document.createElement的iframe无法设置属性name的解决方法
2015/09/14 Javascript
JS数组合并push与concat区别分析
2015/12/17 Javascript
nodejs中全局变量的实例解析
2017/03/07 NodeJs
vue实现移动端图片裁剪上传功能
2020/08/18 Javascript
深入理解ES7的async/await的用法
2017/09/09 Javascript
浅谈在Vue-cli里基于axios封装复用请求
2017/11/06 Javascript
详解如何在React组件“外”使用父组件的Props
2018/01/12 Javascript
JavaScript中concat复制数组方法浅析
2019/01/20 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
用云开发Cloudbase实现小程序多图片内容安全监测的代码详解
2020/06/07 Javascript
javascript实现点击按钮切换轮播图功能
2020/09/23 Javascript
JS highcharts实现动态曲线代码示例
2020/10/16 Javascript
python中readline判断文件读取结束的方法
2014/11/08 Python
python通过pil将图片转换成黑白效果的方法
2015/03/16 Python
Python实现程序的单一实例用法分析
2015/06/03 Python
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
Python后台管理员管理前台会员信息的讲解
2019/01/28 Python
Python中的异常处理try/except/finally/raise用法分析
2019/02/28 Python
Django框架orM与自定义SQL语句混合事务控制操作
2019/06/27 Python
8段用于数据清洗Python代码(小结)
2019/10/31 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
2020/09/03 Python
基于python+selenium自动健康打卡的实现代码
2021/01/13 Python
浅析图片上传及canvas压缩的流程
2020/06/10 HTML / CSS
澳大利亚设计的优质鞋类和适合澳大利亚生活方式的服装:Rivers
2019/04/23 全球购物
Myprotein荷兰官网:欧洲第一运动营养品牌
2020/07/11 全球购物
烹饪自我鉴定
2014/03/01 职场文书
鼓舞士气的口号
2014/06/16 职场文书
项目技术负责人岗位职责
2015/04/13 职场文书
Ajax实现三级联动效果
2021/10/05 Javascript
Java 使用类型为Object的变量指向任意类型的对象
2022/04/13 Java/Android
Python实现对齐打印 format函数的用法
2022/04/28 Python