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 VS ASP
Oct 09 PHP
PHP服务器页面间跳转实现方法
Aug 02 PHP
PHP静态调用非静态方法的应用分析
May 02 PHP
linux系统下php安装mbstring扩展的二种方法
Jan 20 PHP
PHP+Mysql+Ajax+JS实现省市区三级联动
May 23 PHP
一个严格的PHP Session会话超时时间设置方法
Jun 10 PHP
php实现的发送带附件邮件类实例
Sep 22 PHP
php取得字符串首字母的方法
Mar 25 PHP
详解WordPress中给链接添加查询字符串的方法
Dec 18 PHP
详解HTTP Cookie状态管理机制
Jan 14 PHP
PHP开发实现快递查询功能详解
Apr 08 PHP
thinkphp5框架前后端分离项目实现分页功能的方法分析
Oct 08 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性能优化工具篇Benchmark类调试执行时间
2011/12/06 PHP
PHP常用函数和常见疑难问题解答
2014/03/05 PHP
thinkphp使用literal防止模板标签被解析的方法
2014/11/22 PHP
Jquery操作Select 简单方便 一个js插件搞定
2009/11/12 Javascript
基于jQuery架构javascript基础体系
2011/01/01 Javascript
jQuery学习笔记 更改jQuery对象
2012/09/19 Javascript
JavaScript常用全局属性与方法记录积累
2013/07/03 Javascript
封装好的一个万能检测表单的方法
2015/01/21 Javascript
在for循环中length值是否需要缓存
2015/07/27 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
JavaScript模仿Pinterest实现图片预加载功能
2016/10/25 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
微信小程序 跳转传递数据的实例
2017/07/06 Javascript
实例讲解JavaScript预编译流程
2019/01/24 Javascript
Node.js web 应用如何封装到Docker容器中
2020/09/01 Javascript
JavaScript中的Proxy对象
2020/11/27 Javascript
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
pygame学习笔记(2):画点的三种方法和动画实例
2015/04/15 Python
Python简单实现查找一个字符串中最长不重复子串的方法
2018/03/26 Python
Python多重继承的方法解析执行顺序实例分析
2018/05/26 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
Django基础知识 web框架的本质详解
2019/07/18 Python
python3 求约数的实例
2019/12/05 Python
django列表筛选功能的实现代码
2020/03/27 Python
PyCharm常用配置和常用插件(小结)
2021/02/06 Python
Linux面试题LINUX系统类
2015/11/25 面试题
易程科技软件测试笔试
2013/03/24 面试题
JSP&Servlet技术面试题
2015/05/21 面试题
销售高级职员求职信
2013/10/29 职场文书
网络工程专业自荐信范文
2014/03/16 职场文书
网络管理员岗位职责
2014/03/17 职场文书
艺术设计专业个人求职信
2014/04/10 职场文书
学校运动会霸气口号
2014/06/07 职场文书
励志演讲稿3分钟
2014/08/21 职场文书
小学生思想品德评语
2014/12/31 职场文书
html5实现点击弹出图片功能
2021/07/16 HTML / CSS