Laravel框架实现修改登录和注册接口数据返回格式的方法

 更新时间:2018年08月17日 11:22:47   作者:skyisbluening  
这篇文章主要介绍了Laravel框架实现修改登录和注册接口数据返回格式的方法,结合实例形式分析了Laravel框架针对登录与注册接口数据操作流程、原理与修改操作实现方法,需要的朋友可以参考下

本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《Laravel框架入门与进阶教程》、《php优秀开发框架总结》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

相关文章

  • Yii2框架BootStrap样式的深入理解

    Yii2框架BootStrap样式的深入理解

    Yii2框架默认采用了bootstrap作为CSS风格,各种视图类组件都如此。这篇文章主要介绍了Yii2框架BootStrap样式理解的相关资料,需要的朋友可以参考下
    2016-11-11
  • Yii框架 session 数据库存储操作方法示例

    Yii框架 session 数据库存储操作方法示例

    这篇文章主要介绍了Yii框架 session 数据库存储操作方法,结合实例形式分析了使用Yii框架session组件配置与数据库存储相关操作技巧,需要的朋友可以参考下
    2019-11-11
  • 在Nginx上部署ThinkPHP项目教程

    在Nginx上部署ThinkPHP项目教程

    这篇文章主要介绍了在Nginx上部署ThinkPHP项目的方法,十分详细,需要的朋友可以参考下
    2015-02-02
  • thinkPHP模型初始化实例分析

    thinkPHP模型初始化实例分析

    这篇文章主要介绍了thinkPHP模型初始化的方法,结合实例形式分析了thinkPHP模型初始化及数据库操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-12-12
  • Laravel实现构造函数自动依赖注入的方法

    Laravel实现构造函数自动依赖注入的方法

    这篇文章主要介绍了Laravel实现构造函数自动依赖注入的方法,涉及Laravel构造函数自动初始化的相关技巧,需要的朋友可以参考下
    2016-03-03
  • php实现中文转数字

    php实现中文转数字

    这里给大家分享的是一则使用php实现的中文转数字的代码,非常智能,也很完美,有需要的小伙伴可以参考下。
    2016-02-02
  • php实现粘贴截图并完成上传功能

    php实现粘贴截图并完成上传功能

    知乎回答问题编辑框用 Ctrl+V 粘贴图片是如何实现的?刚发现知乎编辑器有这么强的功能,在研究的过程中发现原来segmentfault也实现了这么强大的功能,下面结合2者来看看我们如何实现。
    2015-05-05
  • php判断页面是否是微信打开的示例(微信打开网页)

    php判断页面是否是微信打开的示例(微信打开网页)

    今天遇到一问题,让一个页面在微信上打开,PC上不能直接打开,下面是我使用的方法,现在分享给大家
    2014-04-04
  • PHP、Python和Javascript的装饰器模式对比

    PHP、Python和Javascript的装饰器模式对比

    这篇文章主要介绍了PHP、Python和Javascript的装饰器模式对比,修饰模式(Decorator Pattern),又叫装饰者模式,是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式,需要的朋友可以参考下
    2015-02-02
  • PHP xpath提取网页数据内容代码解析

    PHP xpath提取网页数据内容代码解析

    这篇文章主要介绍了PHP xpath提取网页数据内容代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07

最新评论