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正则
Jul 07 PHP
用PHP实现WEB动态网页静态
Oct 09 PHP
用php实现选择排序的解决方法
May 04 PHP
获取URL文件名后缀
Oct 24 PHP
php发送get、post请求的6种方法简明总结
Jul 08 PHP
php基本函数汇总
Jul 09 PHP
php生成过去100年下拉列表的方法
Jul 20 PHP
PHP获取页面执行时间的方法(推荐)
Dec 10 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
Feb 28 PHP
什么是PHP文件?如何打开PHP文件?
Jun 27 PHP
php判断str字符串是否是xml格式数据的方法示例
Jul 26 PHP
php使用socket调用http和smtp协议实例小结
Jul 26 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
2020年4月放送决定!第2期TV动画《邪神酱飞踢》视觉图&主题曲情报公开!
2020/03/06 日漫
用php过滤危险html代码的函数
2008/07/22 PHP
深入解析PHP中的(伪)多线程与多进程
2013/07/01 PHP
php之header的不同用法总结(实例讲解)
2017/11/28 PHP
php curl优化下载微信头像的方法总结
2018/09/07 PHP
Nigma vs Alliance BO5 第三场2.14
2021/03/10 DOTA
关于全局变量和局部变量的那些事
2013/01/11 Javascript
Jquery实现弹出层分享微博插件具备动画效果
2013/04/03 Javascript
js作用域及作用域链概念理解及使用
2013/04/15 Javascript
JavaScript Serializer序列化时间处理示例
2014/07/31 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
jQuery扩展_动力节点Java学院整理
2017/07/05 jQuery
深入探究AngularJs之$scope对象(作用域)
2017/07/20 Javascript
js中getBoundingClientRect的作用及兼容方案详解
2018/02/01 Javascript
vue-for循环嵌套操作示例
2019/01/28 Javascript
vue实现信息管理系统
2020/05/30 Javascript
前端如何实现动画过渡效果
2021/02/05 Javascript
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
Python操作CouchDB数据库简单示例
2015/03/10 Python
Python实现图片转字符画的示例代码
2017/08/21 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
python制作mysql数据迁移脚本
2019/01/01 Python
基于Tensorflow的MNIST手写数字识别分类
2020/06/17 Python
当我正在为表建立索引的时候,SQL Server 会禁止对表的访问吗
2014/04/28 面试题
CSMA/CD介质访问控制协议
2015/11/17 面试题
Solaris操作系统的线程机制
2012/12/23 面试题
通息工程毕业生自荐信
2013/10/16 职场文书
一年级评语大全
2014/04/23 职场文书
铁路安全事故反思
2014/04/26 职场文书
绿色小区申报材料
2014/08/22 职场文书
戒毒悔改检讨书
2014/09/21 职场文书
乡镇干部个人对照检查材料思想汇报(原创篇)
2014/09/28 职场文书
毕业设计论文致谢词
2015/05/14 职场文书
python not运算符的实例用法
2021/06/30 Python
《艾尔登法环》发布最新「战技」宣传片
2022/04/03 其他游戏
什么是Python装饰器?如何定义和使用?
2022/04/11 Python