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编写PDF文档生成器
Oct 09 PHP
那些年一起学习的PHP(二)
Mar 21 PHP
PHP判断图片格式的七种方法小结
Jun 03 PHP
php日历制作代码分享
Jan 20 PHP
PHP四大安全策略
Mar 12 PHP
php使用curl获取https请求的方法
Feb 11 PHP
PHP的Socket网络编程入门指引
Aug 11 PHP
php设计模式之委托模式
Feb 13 PHP
解读PHP的Yii框架中请求与响应的处理流程
Mar 17 PHP
PHP生成静态HTML文档实现代码
Jun 23 PHP
thinkPHP实现的联动菜单功能详解
May 05 PHP
PHP receiveMail实现收邮件功能
Apr 25 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+MySQL5.0中文乱码解决方法
2006/11/20 PHP
Zend Studio 无法启动的问题解决方法
2008/12/04 PHP
PHPstorm启用自动换行的方法详解(IDE)
2020/09/17 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
2020/12/10 PHP
PHP7 其他语言层面的修改
2021/03/09 PHP
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
2012/07/31 Javascript
JavaScript高级程序设计(第3版)学习笔记5 js语句
2012/10/11 Javascript
JavaScript 模式之工厂模式(Factory)应用介绍
2012/11/15 Javascript
js跑马灯代码(自写)
2013/04/17 Javascript
使用javascript过滤html的字符串(注释标记法)
2013/07/08 Javascript
原生js做的手风琴效果的导航菜单
2013/11/08 Javascript
浅析JavaScript基本类型与引用类型
2014/05/28 Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
2014/06/26 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
2014/09/10 Javascript
JavaScript数据类型之基本类型和引用类型的值
2015/04/01 Javascript
百度地图api如何使用
2015/08/03 Javascript
JS实现超精简响应鼠标显示二级菜单代码
2015/09/12 Javascript
JavaScript操作URL的相关内容集锦
2015/10/29 Javascript
JS实现的走迷宫小游戏完整实例
2017/07/19 Javascript
iview日期控件,双向绑定日期格式的方法
2018/03/15 Javascript
vue2.0 实现富文本编辑器功能
2019/05/26 Javascript
[03:11]不朽宝藏三外观展示
2020/09/18 DOTA
Python全局变量操作详解
2015/04/14 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
python构建深度神经网络(续)
2018/03/10 Python
python3利用Socket实现通信的方法示例
2019/05/06 Python
python正则过滤字母、中文、数字及特殊字符方法详解
2020/02/11 Python
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
IdealFit官方网站:女性蛋白质、补充剂和运动服装
2019/03/24 全球购物
土木工程专业个人求职信
2013/12/05 职场文书
党员公开承诺书
2014/03/25 职场文书
银行优秀员工事迹材料
2014/05/29 职场文书
初中家长意见
2015/06/03 职场文书
详解Redis实现限流的三种方式
2021/04/27 Redis
vue中data里面的数据相互使用方式
2022/06/05 Vue.js