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 图像函数大举例(非原创)
Jun 20 PHP
php设计模式 Facade(外观模式)
Jun 26 PHP
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
Jul 17 PHP
解析php中获取url与物理路径的总结
Jun 21 PHP
smarty获得当前url的方法分享
Feb 14 PHP
PHP开源开发框架ZendFramework使用中常见问题说明及解决方案
Jun 12 PHP
DOM基础及php读取xml内容操作的方法
Jan 23 PHP
php采集中国代理服务器网的方法
Jun 16 PHP
PHP中for循环与foreach的区别
Mar 06 PHP
浅谈PHP错误类型及屏蔽方法
May 27 PHP
Laravel 5.4向IoC容器中添加自定义类的方法示例
Aug 15 PHP
Thinkphp5行为使用方法汇总
Dec 21 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
phpmyadmin3 安装配置图解教程
2012/03/29 PHP
php函数指定默认值方法的小例子
2013/12/04 PHP
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
Laravel 5框架学习之子视图和表单复用
2015/04/09 PHP
PHP中list()函数用法实例简析
2016/01/08 PHP
php微信公众号开发之关键词回复
2018/10/20 PHP
PHP PDO数据库操作预处理与注意事项
2019/03/16 PHP
Laravel如何同时连接多个数据库详解
2019/08/13 PHP
JavaScript Konami Code 实现代码
2009/07/29 Javascript
用js代码和插件实现wordpress雪花飘落效果的四种方法
2014/12/15 Javascript
JavaScript获取当前日期是星期几的方法
2015/04/06 Javascript
js实现点击链接后延迟3秒再跳转的方法
2015/06/05 Javascript
js 获取范围内的随机数实例代码
2016/08/02 Javascript
js中 计算两个日期间的工作日的简单实例
2016/08/08 Javascript
浅析如何利用JavaScript进行语音识别
2016/10/27 Javascript
Vue.js bootstrap前端实现分页和排序
2017/03/10 Javascript
javascript实现下雨效果
2017/03/27 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
2017/05/18 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
2020/02/17 Javascript
使用Python的urllib2模块处理url和图片的技巧两则
2016/02/18 Python
Python实现文件复制删除
2016/04/19 Python
删除python pandas.DataFrame 的多重index实例
2018/06/08 Python
Python多进程fork()函数详解
2019/02/22 Python
matplotlib 多个图像共用一个colorbar的实现示例
2020/09/10 Python
Python 找出英文单词列表(list)中最长单词链
2020/12/14 Python
CSS3实现复选框动画特效示例代码
2016/09/27 HTML / CSS
Parfumdreams芬兰:购买香水和化妆品
2021/02/13 全球购物
数据库面试要点基本概念
2013/10/31 面试题
给学校建议书范文
2014/05/13 职场文书
理财学专业自荐书
2014/06/28 职场文书
七夕活动策划方案
2014/08/16 职场文书
教师反腐倡廉演讲稿
2014/09/03 职场文书
医学检验专业自荐信
2014/09/18 职场文书
详解Django的MVT设计模式
2021/04/29 Python
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript
我家女友可不止可爱呢 公开OP主题曲无字幕动画MV
2022/04/11 日漫