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 相关文章推荐
第六节--访问属性和方法
Nov 16 PHP
详解PHP显示MySQL数据的三种方法
Jun 05 PHP
PHP 数组遍历顺序理解
Sep 09 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
Jul 12 PHP
linux下编译安装memcached服务
Aug 03 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
Aug 28 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
Oct 15 PHP
PHP连接MSSQL方法汇总
Feb 05 PHP
Laravel 5.3 学习笔记之 配置
Aug 28 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
Thinkphp5行为使用方法汇总
Dec 21 PHP
php中用unset销毁变量并释放内存
May 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
Discuz!X中SESSION机制实例详解
2015/09/23 PHP
PHP实现链式操作的原理详解
2016/09/16 PHP
Yii使用EasyWechat实现小程序获取用户的openID的方法
2020/04/29 PHP
jquery中通过过滤器获取表单元素的实现代码
2011/07/05 Javascript
IE中jquery.form中ajax提交没反应解决方法分享
2012/09/11 Javascript
javascript分页代码(当前页码居中)
2012/09/20 Javascript
jquery实现盒子下拉效果示例代码
2013/09/12 Javascript
jqGrid增加时--判断开始日期与结束日期(实例解析)
2013/11/08 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
javascript面向对象特性代码实例
2014/06/12 Javascript
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
javascript实现倒计时并弹窗提示特效
2015/06/05 Javascript
jquery实现鼠标滑过小图查看大图的方法
2015/07/20 Javascript
JavaScript 下载svg图片为png格式
2018/06/21 Javascript
详解React之父子组件传递和其它一些要点
2018/06/25 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
2018/07/25 Javascript
深入理解js A*寻路算法原理与具体实现过程
2018/12/13 Javascript
Vue 实现手动刷新组件的方法
2019/02/19 Javascript
微信小程序控制台提示warning:Now you can provide attr "wx:key" for a "wx:for" to improve performance解决方法
2019/02/21 Javascript
解决layer图标icon不加载的问题
2019/09/04 Javascript
详谈Object.defineProperty 及实现数据双向绑定
2020/07/18 Javascript
把大数据数字口语化(python与js)两种实现
2013/02/21 Python
在Pycharm terminal中字体大小设置的方法
2019/01/16 Python
如何更优雅地写python代码
2019/07/02 Python
Python3远程监控程序的实现方法
2019/07/15 Python
python中单下划线(_)和双下划线(__)的特殊用法
2019/08/29 Python
python3中利用filter函数输出小于某个数的所有回文数实例
2019/11/24 Python
Python Selenium安装及环境配置的实现
2020/03/17 Python
Django使用Profile扩展User模块方式
2020/05/14 Python
Python 发送邮件方法总结
2020/08/10 Python
听课评语大全
2014/04/30 职场文书
2014医学院领导干部四风对照检查材料思想汇报
2014/09/16 职场文书
部门2014年度工作总结
2014/11/12 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
教你用Python matplotlib库制作简单的动画
2021/06/11 Python
使用Djongo模块在Django中使用MongoDB数据库
2021/06/20 Python