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多进程操作实例
Nov 21 Python
python如何通过实例方法名字调用方法
Mar 21 Python
python画一个玫瑰和一个爱心
Aug 18 Python
python通过paramiko复制远程文件及文件目录到本地
Apr 30 Python
Python3.7+tkinter实现查询界面功能
Dec 24 Python
Django用户身份验证完成示例代码
Apr 03 Python
Python pip install如何修改默认下载路径
Apr 29 Python
从python读取sql的实例方法
Jul 21 Python
通过实例简单了解python yield使用方法
Aug 06 Python
python实现数据结构中双向循环链表操作的示例
Oct 09 Python
python中_del_还原数据的方法
Dec 09 Python
Python学习之包与模块详解
Mar 19 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阻止页面后退的方法分享
2014/02/17 PHP
PHP实现上传文件并存进数据库的方法
2015/07/16 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
laravel框架 api自定义全局异常处理方法
2019/10/11 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
2020/04/26 PHP
javascript 防止刷新,后退,关闭
2010/08/07 Javascript
jQuery EasyUI API 中文文档 - Menu菜单
2011/10/03 Javascript
用jquery中插件dialog实现弹框效果实例代码
2013/11/15 Javascript
js获取ajax返回值代码
2014/04/30 Javascript
jQuery中closest和parents的区别分析
2015/05/07 Javascript
使用AngularJS实现表单向导的方法
2015/06/19 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
2016/05/17 Javascript
打造自己的jQuery插件入门教程
2016/09/23 Javascript
javascript 秒表计时器实现代码
2017/03/09 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
vue结合axios与后端进行ajax交互的方法
2018/07/06 Javascript
javascript实现文字跑马灯效果
2020/06/18 Javascript
vue 路由meta 设置导航隐藏与显示功能的示例代码
2020/09/04 Javascript
python 读取目录下csv文件并绘制曲线v111的方法
2018/07/06 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
python3.8 微信发送服务器监控报警消息代码实现
2019/11/05 Python
Django xadmin开启搜索功能的实现
2019/11/15 Python
基于打开pycharm有带图片md文件卡死问题的解决
2020/04/24 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
2020/08/04 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
python 统计list中各个元素出现的次数的几种方法
2021/02/20 Python
CSS3 icon font完全指南(CSS3 font 会取代icon图标)
2013/01/06 HTML / CSS
css3 iphone玻璃透明气泡完美实现
2013/03/20 HTML / CSS
嘻哈珠宝品牌:KRKC&CO
2020/10/19 全球购物
中文专业毕业生自荐信
2013/10/28 职场文书
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
办理退休介绍信
2014/01/09 职场文书
营销总经理岗位职责
2014/02/02 职场文书
媒体宣传策划方案
2014/05/25 职场文书
条幅标语大全
2014/06/20 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书