Laravel框架表单验证格式化输出的方法


Posted in Python onSeptember 25, 2019

最近在公司的项目开发中使用到了 laravel 框架,采用的是前后端开发的模式。接触过前后端开发模式的小伙伴应该都知道,后端返回的数据格式需要尽可能搞得保证一致性,这样前端在处理时也方便处理。我们先通过观看下面的两张接口返回的效果图吧,这样或许会更加的直观一些。

Laravel框架表单验证格式化输出的方法

laravel默认的输出格式(图一)

Laravel框架表单验证格式化输出的方法

修改后的输出格式(图二)

或许通过上面两张图,你还是未看出有什么区别的话。这里我用文字描述一下吧。 这种情况是发生在laravel做表单验证的情况下发生的。前端向我后端接口发送一个POST请求时,发送了一个title和body的字段。我后端需要对两个字段做一些非空验证。按照框架手册来进行的话,输出的格式就是图一的格式。然后后端统一的输出格式是图二中的格式,如果按照图一的格式输出肯定是不行,这样就需要我们做一个特殊处理。

问题排查

首先我们可以通过文档参看到如下信息。下面划线的部分,提到的返回信息是将所有未验证通过的数据都返回给前端,就如图一中的数据格式。

Laravel框架表单验证格式化输出的方法

laravel默认的输出格式(图三)

预期效果

通过图三我们知道了 laravel 默认的是返回一个带 422 的 http 状态码并且将所有的验证错误信息都返回。

然而我们需要的只是如图二的格式,单个的输出错误信息。大致的解决思路就是在输出的时候,我们去默认显示第一个未通过的验证信息,当通过之后,之前第二个未严重通过的就变成了第一个,这样依次循环下去,我们的每个数据就得到了验证。验证的地方我们选择框架异常统一处理的地方,这样每次验证都自动的进行处理。

解决方案

该框架是 laravel5.8 的情况下进行编写,如果版本不同,或许还需要特殊的处理,不过处理的思路可以参考下面的。

1.创建一个表单验证器。执行下面的命令之后,我们在php app/Http/Requests目录下面就可以看到该类文件了。

php artisan make:request ProjectValidate

2.定义验证规则。rules 方法是定义验证规则,而 messages 方法则是定义返回的错误信息,该方法也可以省略掉,这样提示的信息就是英文而不是图一或图二看到的中文了。

namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ProjectValidate extends FormRequest
{
  /**
   * Determine if the user is authorized to make this request.
   *
   * @return bool
   */
  public function authorize()
  {
    return true;
  }
  /**
   * Get the validation rules that apply to the request.
   *
   * @return array
   */
  public function rules()
  {
    return [
      'title' => 'bail|required',
      'body' => 'required',
    ];
  }
  /**
   * define the validation message
   *
   * @return array
   */
  public function messages()
  {
    return [
      'title.required' => '文章标题必填',
      'body.required' => '文章内容必填',
    ];
  }
}

3.使用验证器。这里我定义了一个控制器,在 addData 方法中,使用依赖注入的方式去实现数据的验证。记住,该方法体在未通过数据验证的情况下是不会去执行的。

namespace App\Http\Controllers\Backend\Project;

use App\Http\Requests\ProjectValidate;
use App\Http\Controllers\Backend\UCenter;

class Index extends UCenter
{
  public function index()
  {
    return success();
  }
  public function addData(ProjectValidate $request)
  {
    $validated = $request->validated();
    return success($validated);
  }
}

4.统一处理数据格式。找到php App\Exceptions\Handler.php文件,找到下面的方法,修改为如下内容。这时候在做表单验证就会显示图二的格式信息了。

public function render($request, Exception $exception)
  {
    if ($exception instanceof ValidationException) {
      // 只读取错误中的第一个错误信息
      $errors = $exception->errors();
      $message = '';
      // 框架返回的是二维数组,因此需要去循环读取第一个数据
      foreach ($errors as $key => $val) {
        $keys  = array_key_first($val);
        $message = $val[$keys];
        break;
      }
      return response()->json(['code' => 1001, 'message' => $message, 'data' => []], 422);
    }
    return parent::render($request, $exception);
  }

总结

1.优势

输出固定的格式,前端在处理数据的时候,不需要做特别的格式上面调整。

2.劣势

这样的方式验证,每验证一次,就会向后端发送一个 http 请求。

以上所述是小编给大家介绍的Laravel框架表单验证格式化输出的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python使用reportlab实现图片转换成pdf的方法
May 22 Python
Python松散正则表达式用法分析
Apr 29 Python
Python的装饰器用法学习笔记
Jun 24 Python
Python 制作糗事百科爬虫实例
Sep 22 Python
python+VTK环境搭建及第一个简单程序代码
Dec 13 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
Apr 27 Python
python按时间排序目录下的文件实现方法
Oct 17 Python
python实现复制大量文件功能
Aug 31 Python
使用 Python 在京东上抢口罩的思路详解
Feb 27 Python
Python爬虫爬取百度搜索内容代码实例
Jun 05 Python
python opencv实现图像配准与比较
Feb 09 Python
Python爬虫之爬取最新更新的小说网站
May 06 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
Sep 25 #Python
python 用户交互输入input的4种用法详解
Sep 24 #Python
python getpass实现密文实例详解
Sep 24 #Python
使用Python的turtle模块画国旗
Sep 24 #Python
给你一面国旗 教你用python画中国国旗
Sep 24 #Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
Sep 24 #Python
Python获取时间戳代码实例
Sep 24 #Python
You might like
PHP函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
destoon在360浏览器下出现用户被强行注销的解决方法
2014/06/26 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
2016/05/20 PHP
PHP目录操作实例总结
2016/09/27 PHP
Domino中运用jQuery读取视图内容的方法
2009/10/21 Javascript
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
angularjs客户端实现压缩图片文件并上传实例
2015/07/06 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
2015/11/23 Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
2016/05/12 Javascript
easyui tree带checkbox实现单选的简单实例
2016/11/07 Javascript
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
2016/12/15 Javascript
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
2017/05/20 jQuery
Vue press 支持图片放大功能的实例代码
2018/11/09 Javascript
微信小程序列表时间戳转换实现过程解析
2019/10/12 Javascript
js中addEventListener()与removeEventListener()用法案例分析
2020/03/02 Javascript
[00:55]2015国际邀请赛中国区预选赛5月23日——28日约战上海
2015/05/25 DOTA
[02:03]风行者至宝清风环佩外观展示
2020/09/05 DOTA
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
2017/08/08 Python
python安装mysql的依赖包mysql-python操作
2021/01/01 Python
Python实现简单的2048小游戏
2021/03/01 Python
深入理解css中vertical-align属性
2017/04/18 HTML / CSS
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
牦牛毛户外探险服装:Kora
2019/02/08 全球购物
雷曼兄弟的五金店:Lehman’s Hardware Store
2019/04/10 全球购物
将时尚融入珠宝:Adornmonde
2019/10/17 全球购物
澳大利亚窗帘商店:Curtain Wonderland
2019/12/01 全球购物
晚归检讨书
2014/02/19 职场文书
公司接待方案
2014/03/08 职场文书
租房合同协议书
2014/04/09 职场文书
《跟踪台风的卫星》教学反思
2014/04/10 职场文书
英语系本科生求职信
2014/07/15 职场文书
2014年服务员个人工作总结
2014/12/23 职场文书
奖学金个人总结
2015/03/04 职场文书
关于清明节的演讲稿2015
2015/03/18 职场文书
Nginx如何配置多个服务域名解析共用80端口详解
2022/09/23 Servers