Laravel框架实现修改登录和注册接口数据返回格式的方法


Posted in PHP onAugust 17, 2018

本文实例讲述了Laravel框架实现修改登录和注册接口数据返回格式的方法。分享给大家供大家参考,具体如下:

1、背景:需要将所有的数据返回格式统一成retCode/retMsg/data

2、登陆接口:

文件目录:app/Http/Controllers/Auth/LoginController

先写登陆接口是因为修改登录接口比注册接口要简单许多

登录接口中的第一句

use AuthenticatesUsers;

可以进去修改登录验证内容(默认是email+password登录),可以修改

validateLogin()或者直接修改username(),将email改成name,即可用name+password登录了

修改登录接口数据返回格式login()方法

public function login(Request $request)
{
    $this->validateLogin($request);
    if ($this->attemptLogin($request)) {
      $user = $this->guard()->user();
      $user->generateToken();
      $ret=new RetObject();
      $ret->retCode="0000";
      $ret->retMsg='success';
      $ret->data= $user->toArray();
    }else{
      $ret=new RetObject();
      $ret->retCode="0001";
      $ret->retMsg='failed';
      $ret->data= null;
    }
    return response()->json($ret);
}

直接修改login方法中的返回内容就可以了

3、注册接口

一开始我都不知道register的接口到底是藏在哪

然后看routes/api.php里的

Route::post('register', 'Auth\RegisterController@register');

这里register接口指向的是RegisterController中的 register方法

但是在RegisterController没有找到register方法,只有registered、validator、create这几个方法

真正的register方法在第一句的

use RegistersUsers;
RegistersUsers的register
public function register(Request $request)
{
    $this->validator($request->all())->validate();
    event(new Registered($user = $this->create($request->all())));
    $this->guard()->login($user);
    return $this->registered($request, $user)
            ?: redirect($this->redirectPath());
}

这里用到了RegisterController  中的registered、validator、create这几个方法

成功的情况下,修改数据返回格式比较简单

直接在RegisterController中的registered()方法中修改

protected function registered(Request $request,$user)
{
  $user->generateToken();
  $ret=new RetObject();
  $ret->retCode="0000";
  $ret->retMsg='register success';
  $ret->data= $user->toArray();
  return response()->json($ret);
}

然后在哪里捕捉异常然后失败的时候修改数据返回格式,捣鼓了好久。

一开始尝试直接在RegisterController中的registered()方法中使用try/catch捕捉异常信息,但是每次Debug都不会跳进来,直接在更底层验证的时候就直接输出报错信息了。

try{
  $user->generateToken();
  $ret=new RetObject();
  $ret->retCode="0000";
  $ret->retMsg='register success';
  $ret->data= $user->toArray();
  return response()->json($ret);
}catch (Exception $exception){
  $ret=new RetObject();
  $ret->retCode="0001";
  $ret->retMsg='register failed';
  $ret->data= null;
  return response()->json($ret);
}

最终在app/Exception/Handler.php

report方法是用来将异常写入日志,render是用来渲染各种异常的浏览器输出

所以我们应该是在render中修改捕捉到异常之后返回数据的格式

public function render($request, Exception $exception)
{
    // This will replace our 404 response with
    // a JSON response.
    if ($exception instanceof ModelNotFoundException &&
      $request->wantsJson())
    {
      $ret=new RetObject();
      $ret->retCode="404";
      $ret->retMsg='页面未找到';
      $ret->data= null;
      return response()->json($ret);
    }elseif ($exception instanceof ValidationException)
    {
      $ret=new RetObject();
      $ret->retCode="0001";
      $ret->retMsg=$exception->getMessage();
      $ret->data= null;
      return response()->json($ret);
    }
    return parent::render($request, $exception);
}

然后起码是可以自定义捕捉到验证数据异常ValidationException 时候的返回数据格式了,还有其他的异常也是可以直接在Handler.phprender方法中添加。

补充一下Handler的异常处理的控制器基类:目录为vendor/laravel/framework/src/Illuminate/Foundation/Exception/Handler.php

中的report和render方法

public function report(Exception $e)
{
    if ($this->shouldntReport($e)) {
      return;
    }
    try {
      $logger = $this->container->make(LoggerInterface::class);
    } catch (Exception $ex) {
      throw $e; // throw the original exception
    }
    $logger->error($e);
}
public function render($request, Exception $e)
{
    $e = $this->prepareException($e);
    if ($e instanceof HttpResponseException) {
      return $e->getResponse();
    } elseif ($e instanceof AuthenticationException) {
      return $this->unauthenticated($request, $e);
    } elseif ($e instanceof ValidationException) {
      return $this->convertValidationExceptionToResponse($e, $request);
    }
    return $this->prepareResponse($request, $e);
}

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

PHP 相关文章推荐
文件上传程序的全部源码
Oct 09 PHP
php at(@)符号的用法简介
Jul 11 PHP
PHP获取数组最后一个值的2种方法
Jan 21 PHP
PHP扩展开发入门教程
Feb 26 PHP
检测codeigniter脚本消耗内存情况的方法
Mar 21 PHP
一个简单至极的PHP缓存类代码
Oct 23 PHP
PHP使用curl模拟post上传及接收文件的方法
Mar 04 PHP
ThinkPHP3.2.3实现分页的方法详解
Jun 03 PHP
php面试中关于面向对象的相关问题
Feb 13 PHP
php文件后缀不强制为.php的实操方法
Sep 18 PHP
PHP文件打开关闭及读写操作示例解析
Aug 06 PHP
PHP接入支付宝接口失效流程详解
Nov 10 PHP
ThinkPHP5+Layui实现图片上传加预览功能
Aug 17 #PHP
PHP实现类似题库抽题效果
Aug 16 #PHP
php实现的rc4加密解密类定义与用法示例
Aug 16 #PHP
Laravel框架实现定时发布任务的方法
Aug 16 #PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
Aug 16 #PHP
Laravel中的chunk组块结果集处理与注意问题
Aug 15 #PHP
PHP curl批处理及多请求并发实现方法分析
Aug 15 #PHP
You might like
php session劫持和防范的方法
2013/11/12 PHP
childNodes.length与children.length的区别
2009/05/14 Javascript
非常有用的40款jQuery 插件推荐(系列二)
2011/12/25 Javascript
在浏览器窗口上添加遮罩层的方法
2012/11/12 Javascript
javascript 构造函数强制调用经验总结
2012/12/02 Javascript
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
基于jquery实现控制经纬度显示地图与卫星
2013/05/20 Javascript
node.js中的socket.io的广播消息
2014/12/15 Javascript
js实现div层缓慢收缩与展开的方法
2015/05/11 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
异步安全加载javascript文件的方法
2015/07/21 Javascript
JS+CSS实现的漂亮渐变背景特效代码(6个渐变效果)
2016/03/25 Javascript
无需 Flash 使用 jQuery 复制文字到剪贴板
2016/04/26 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
Bootstrap缩略图的创建方法
2017/03/22 Javascript
vue自动路由-单页面项目(非build时构建)
2019/04/30 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
react ant Design手动设置表单的值操作
2020/10/31 Javascript
Nest.js环境变量配置与序列化详解
2021/02/21 Javascript
Python中非常实用的一些功能和函数分享
2015/02/14 Python
Python实现将DOC文档转换为PDF的方法
2015/07/25 Python
python 全局变量的import机制介绍
2017/09/07 Python
Python udp网络程序实现发送、接收数据功能示例
2019/12/09 Python
python框架flask入门之路由及简单实现方法
2020/06/07 Python
HTML5 在canvas中绘制文本附效果图
2014/06/23 HTML / CSS
HTML5中drawImage用法分析
2014/12/01 HTML / CSS
介绍一下UNIX启动过程
2013/11/14 面试题
搞笑婚礼主持词
2014/03/13 职场文书
防沙治沙典型材料
2014/05/07 职场文书
学校四风问题对照检查材料思想汇报
2014/09/26 职场文书
烈士陵园观后感
2015/06/08 职场文书
大学校园招聘会感想
2015/08/10 职场文书
高中政治教师教学反思
2016/02/23 职场文书
pycharm debug 断点调试心得分享
2021/04/16 Python
golang中字符串MD5生成方式总结
2021/07/04 Golang
JavaScript模拟实现网易云轮播效果
2022/04/04 Javascript