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连mysql和oracle数据库性能比较
Oct 09 PHP
用文本文件实现的动态实时发布新闻的程序
Oct 09 PHP
php 远程关机操作的代码
Dec 05 PHP
pdo中使用参数化查询sql
Aug 11 PHP
ThinkPHP分页类使用详解
Mar 05 PHP
删除html标签得到纯文本可处理嵌套的标签
Apr 28 PHP
CI框架中通过hook的方式实现简单的权限控制
Jan 07 PHP
PHP中addslashes与mysql_escape_string的区别分析
Apr 25 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
Nov 16 PHP
php中html_entity_decode实现HTML实体转义
Jun 13 PHP
为你的 Laravel 验证器加上多验证场景的实现
Apr 07 PHP
基于ThinkPHP删除目录及目录文件函数
Oct 28 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遍历删除整个目录及文件的方法
2015/03/13 PHP
PHP实现操作redis的封装类完整实例
2015/11/14 PHP
详解WordPress开发中用于获取分类及子页面的函数用法
2016/01/08 PHP
网页的分页下标生成代码(PHP后端方法)
2016/02/03 PHP
ThinkPHP实现附件上传功能
2017/04/27 PHP
javascript replace方法与正则表达式
2008/02/19 Javascript
js实现权限树的更新权限时的全选全消功能
2009/02/17 Javascript
JavaScript 拾漏补遗
2009/12/27 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
2013/04/09 Javascript
js点击选择文本的方法
2015/02/09 Javascript
jquery控制显示服务器生成的图片流
2015/08/04 Javascript
JavaScript实现点击按钮就复制当前网址
2015/12/14 Javascript
JS实现保留n位小数的四舍五入问题示例
2016/08/03 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
简单理解js的冒泡排序
2016/12/19 Javascript
JS实现的RGB网页颜色在线取色器完整实例
2016/12/21 Javascript
浅谈jQuery中事情的动态绑定
2017/02/12 Javascript
使用Node.js实现一个多人游戏服务器引擎
2019/03/13 Javascript
基于layui框架响应式布局的一些使用详解
2019/09/16 Javascript
vue解决花括号数据绑定不成功的问题
2019/10/30 Javascript
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
python操作字典类型的常用方法(推荐)
2016/05/16 Python
详解Python中open()函数指定文件打开方式的用法
2016/06/04 Python
python中实现指定时间调用函数示例代码
2017/09/08 Python
对python内置map和six.moves.map的区别详解
2018/12/19 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
2020/06/02 Python
Nike意大利官网:Nike.com IT
2020/01/19 全球购物
奥林匹亚体育:Olympia Sports
2020/12/30 全球购物
大学生专业个人学习的自我评价
2013/10/26 职场文书
经营理念标语
2014/06/21 职场文书
促销活动总结模板
2014/07/01 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
财政局个人总结
2015/03/04 职场文书
2015年度服装销售工作总结
2015/03/31 职场文书
《小摄影师》教学反思
2016/02/18 职场文书