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 相关文章推荐
php扩展ZF――Validate扩展
Jan 10 PHP
深入理解PHP原理之错误抑制与内嵌HTML分析
May 02 PHP
PHP投票系统防刷票判断流程分析
Feb 04 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
Jan 19 PHP
php命令行用法入门实例教程
Oct 27 PHP
php实现过滤UBB代码的类
Mar 12 PHP
PHP基于MySQL数据库实现对象持久层的方法
Jun 17 PHP
初识通用数据库操作类――前端easyui-datagrid,form(php)
Jul 31 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
Aug 17 PHP
PHP使用pear实现mail发送功能 windows环境下配置pear
Apr 15 PHP
laravel自定义分页效果
Jul 23 PHP
TP5框架实现一次选择多张图片并预览的方法示例
Apr 04 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内核探索:变量概述
2014/01/30 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
2017/07/10 PHP
Nginx下ThinkPHP5的配置方法详解
2017/08/01 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
js中几种去掉字串左右空格的方法
2006/12/25 Javascript
JavaScript中原型和原型链详解
2015/02/11 Javascript
JS数组合并push与concat区别分析
2015/12/17 Javascript
JavaScript判断用户名和密码不能为空的实现代码
2016/05/16 Javascript
AngularJS ng-repeat数组有重复值的解决方法
2016/10/23 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
2016/12/02 Javascript
JavaScript中三种常见的排序方法
2017/02/24 Javascript
Angular中的$watch、$watchGroup、$watchCollection
2017/06/25 Javascript
Vue 2.5 Level E 发布了: 新功能特性一览
2017/10/24 Javascript
结合Vue控制字符和字节的显示个数的示例
2018/05/17 Javascript
iView框架问题整理小结
2018/10/16 Javascript
Vue.js 中制作自定义选择组件的代码附演示demo
2020/02/28 Javascript
[02:38]2018年度DOTA2最佳劣单位选手-完美盛典
2018/12/17 DOTA
python操作CouchDB的方法
2014/10/08 Python
Python3中条件控制、循环与函数的简易教程
2017/11/21 Python
PyTorch快速搭建神经网络及其保存提取方法详解
2018/04/28 Python
Python logging模块原理解析及应用
2020/08/13 Python
python绘图pyecharts+pandas的使用详解
2020/12/13 Python
python在协程中增加任务实例操作
2021/02/28 Python
HTML5和以前HTML4的区别整理
2013/10/20 HTML / CSS
Blancsom美国/加拿大:服装和生活用品供应商
2018/07/27 全球购物
党委书记岗位职责
2013/11/24 职场文书
个人四风问题原因分析及整改措施
2014/09/28 职场文书
文明单位汇报材料
2014/12/24 职场文书
党建工作汇报材料
2014/12/24 职场文书
地雷战观后感
2015/06/09 职场文书
 Python 中 logging 模块使用详情
2022/03/03 Python
「玫瑰之王的葬礼」舞台剧主视觉图公开
2022/03/21 日漫
CSS中float高度塌陷问题的四种解决方案
2022/04/18 HTML / CSS
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript