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:风雨欲来 路在何方?
Oct 09 PHP
php 对输入信息的进行安全过滤的函数代码
Jun 29 PHP
PHP更新购物车数量(表单部分/PHP处理部分)
May 03 PHP
解析smarty模板中类似for的功能实现
Jun 18 PHP
php指定函数参数默认值示例代码
Dec 04 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
Jun 19 PHP
php格式化金额函数分享
Feb 02 PHP
laravel 5 实现模板主题功能
Mar 02 PHP
yii数据库的查询方法
Dec 28 PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
May 02 PHP
PHP7基于curl实现的上传图片功能
May 11 PHP
浅谈php的TS和NTS的区别
Mar 13 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的面向对象编程
2006/10/09 PHP
php echo()和print()、require()和include()函数区别说明
2010/03/27 PHP
php下删除一篇文章生成的多个静态页面
2010/08/08 PHP
php截取字符串并保留完整xml标签的函数代码
2013/02/06 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
2014/07/08 PHP
如何使用json在前后台进行数据传输实例介绍
2013/04/11 Javascript
没有document.getElementByName方法
2013/08/19 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
2014/01/26 Javascript
js Canvas实现圆形时钟教程
2016/09/19 Javascript
JavaScript实现多栏目切换效果
2016/12/12 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
2016/12/14 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
vue使用Axios做ajax请求详解
2017/06/07 Javascript
vue addRoutes实现动态权限路由菜单的示例
2018/05/15 Javascript
vue translate peoject实现在线翻译功能【新手必看】
2018/06/07 Javascript
JS实现字符串翻转的方法分析
2018/08/31 Javascript
跟老齐学Python之编写类之二方法
2014/10/11 Python
Python爬取网易云音乐上评论火爆的歌曲
2017/01/19 Python
Python实现破解猜数游戏算法示例
2017/09/25 Python
tensorflow 获取模型所有参数总和数量的方法
2018/06/14 Python
Python import与from import使用及区别介绍
2018/09/06 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
2019/04/11 Python
Python Subprocess模块原理及实例
2019/08/26 Python
PIP和conda 更换国内安装源的方法步骤
2020/09/21 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
canvas之万花筒效果的简单实现(推荐)
2016/08/16 HTML / CSS
CSS3 实现倒计时效果
2020/11/25 HTML / CSS
介绍一下Ruby的特点
2013/01/20 面试题
优秀会计求职信
2014/07/04 职场文书
庆六一宣传标语
2014/10/08 职场文书
元宵节晚会主持词
2015/07/01 职场文书
2015年中秋放假通知范文
2015/08/18 职场文书
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android