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&&mysql)三
Oct 09 PHP
信用卡效验程序
Oct 09 PHP
随时给自己贴的图片加文字的php水印
Mar 16 PHP
php 正确解码javascript中通过escape编码后的字符
Jan 28 PHP
基于PHP5魔术常量与魔术方法的详解
Jun 13 PHP
php批量更改数据库表前缀实现方法
Oct 26 PHP
分享一段PHP制作的中文拼音首字母工具类
Dec 11 PHP
php实现的网络相册图片防盗链完美破解方法
Jul 01 PHP
PHP未登录自动跳转到登录页面
Dec 21 PHP
PHP基于SPL实现的迭代器模式示例
Apr 22 PHP
PHP单例模式模拟Java Bean实现方法示例
Dec 07 PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 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
thinkphp3查询mssql数据库乱码解决方法分享
2014/02/11 PHP
php实现处理输入转义字符的代码
2015/11/08 PHP
js left,right,mid函数
2008/06/10 Javascript
js使用for循环查询数组中是否存在某个值
2014/08/12 Javascript
使用typeof方法判断undefined类型
2014/09/09 Javascript
JavaScript中解析JSON数据的三种方法
2015/07/03 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
jQuery提示插件qTip2用法分析(支持ajax及多种样式)
2016/06/08 Javascript
javascript 分号总结及详细介绍
2016/09/24 Javascript
jQuery快速实现商品数量加减的方法
2017/02/06 Javascript
ES6新特性七:数组的扩充详解
2017/04/21 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
详解webpack自动生成html页面
2017/06/29 Javascript
JavaScript怎样在删除前添加确认弹出框?
2019/05/27 Javascript
layui原生表单验证的实例
2019/09/09 Javascript
vue获取form表单的值示例
2019/10/29 Javascript
Vue实现腾讯云点播视频上传功能的实现代码
2020/08/17 Javascript
[14:51]DOTA2 HEROS教学视频教你分分钟做大人-卓尔游侠
2014/06/13 DOTA
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
使用Python程序抓取新浪在国内的所有IP的教程
2015/05/04 Python
Python中文件I/O高效操作处理的技巧分享
2017/02/04 Python
python文本数据相似度的度量
2018/03/12 Python
使用Python的Django和layim实现即时通讯的方法
2018/05/25 Python
python可视化text()函数使用详解
2020/02/11 Python
使用celery和Django处理异步任务的流程分析
2020/02/19 Python
Python可变对象与不可变对象原理解析
2020/02/25 Python
英国标志性奢侈品牌:Burberry
2016/07/28 全球购物
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
美国环保婴儿用品公司:The Honest Company
2017/11/23 全球购物
印度服装购物网站:Limeroad
2018/09/26 全球购物
三年大学生活自我鉴定
2014/01/21 职场文书
租房协议书范文
2014/08/20 职场文书
企业转让协议书(范文2篇)
2019/08/15 职场文书
分位数回归模型quantile regeression应用详解及示例教程
2021/11/02 Python
PostGIS的安装与入门使用指南
2022/01/18 PostgreSQL