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中require和require_once的区别说明
Feb 27 PHP
PHP正则提取不包含指定网址的图片地址的例子
Apr 21 PHP
PHP常用技术文之文件操作和目录操作总结
Sep 27 PHP
thinkphp判断访客为手机端或PC端的方法
Nov 24 PHP
php继承中方法重载(覆盖)的应用场合
Feb 09 PHP
php通过baihui网API实现读取word文档并展示
Jun 22 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
Dec 19 PHP
详解WordPress中用于更新和获取用户选项数据的PHP函数
Mar 08 PHP
Apache PHP MySql安装配置图文教程
Aug 27 PHP
php中让人头疼的浮点数运算分析
Oct 10 PHP
PHP实现限制IP访问及提交次数的方法详解
Jul 17 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 和 MySQL 基础教程(二)
2006/10/09 PHP
fleaphp rolesNameField bug解决方法
2011/04/23 PHP
解析php函数method_exists()与is_callable()的区别
2013/06/21 PHP
PHP汉字转换拼音的函数代码
2015/12/30 PHP
实例解析php的数据类型
2018/10/24 PHP
PHP时间戳和日期相互转换操作实例小结
2018/12/18 PHP
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
jquery eval解析JSON中的注意点介绍
2013/08/23 Javascript
js获得页面的高度和宽度的方法
2014/02/23 Javascript
jQuery验证插件 Validate详解
2014/11/20 Javascript
js跨域请求数据的3种常用的方法
2015/12/01 Javascript
浅析Bootstrap表格的使用
2016/06/23 Javascript
利用jQuery实现打字机字幕效果实例代码
2016/09/02 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
防止重复发送 Ajax 请求
2017/02/15 Javascript
NodeJs下的测试框架Mocha的简单介绍
2017/02/22 NodeJs
Bootstrap Table使用整理(二)
2017/06/09 Javascript
React中的render何时执行过程
2018/04/13 Javascript
详解Vue This$Store总结
2018/12/17 Javascript
JavaScript和TypeScript中的void的具体使用
2019/09/12 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
2019/12/16 Javascript
[56:57]LGD vs VP 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第一场 8.20.mp4
2019/08/22 DOTA
Python实现多线程抓取网页功能实例详解
2017/06/08 Python
Python实现的视频播放器功能完整示例
2018/02/01 Python
Python实现二叉树的常见遍历操作总结【7种方法】
2019/03/06 Python
利用Python校准本地时间的方法教程
2019/10/31 Python
英国最大的独立家具零售商:Furniture Village
2016/09/06 全球购物
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
Waterford英国官方网站:世界上最受欢迎的优质水晶品牌
2019/08/17 全球购物
new修饰符是起什么作用
2015/06/28 面试题
实用求职信范文分享
2013/12/25 职场文书
《十六年前的回忆》教学反思
2014/02/14 职场文书
自我推荐信范文
2014/05/09 职场文书
预防艾滋病宣传标语
2014/06/25 职场文书
商标侵权律师函
2015/05/27 职场文书
晚会开幕词范文
2016/03/04 职场文书