使用场景

我们在使用laravel来写API时,经常需要返回一个json字符串或JsonResponse,通常我们的做法可能有两种。

1、在BaseController中定义一个返回Json响应de方法,然后继承该BaseController。如:

//BaseController.phppublic function json($data = null, $status = 200, $headers = [], $options = 0)
{return new JsonResponse($data, $status, $headers, $options);
}//YourController.php
class YourController extends BaseController
{public function users(UserRepository $userRepository){return $this->json($userRepository->allUser());}
}

然而这写法确实挺方便,然而当你在其他地方需要使用到Json响应时(如中间件验证失败时你想要返回一个Json响应)。你无法使用到$this->json(...)

2、直接在需要用到Json响应得地方使用return new JsonResponse或者使用Response Facade

但这种做法当需要修改Response响应时得全部改动,不可取。

Response 宏

Laravel提供了一个非常方便的响应宏来处理这一情况

首先,我们需要先注册一个响应宏,在任意一个ServiceProviderboot方法里(ResponseMacroServiceProvider ),使用Response Facade注册


Response::macro('success', function ($data = [], $message = 'success') {return new JsonResponse(['code' => 0,'data' => $data,'message' => $message], 200);
});

接下来, 你可以再任何地方使用它response()

//UserController.phppublic function users(UserRepository $userRepository)
{return response()->success($userRepository->all(), 'success');
}

注意,你只能通过response()这个全局方法或是app('Illuminate\Routing\ResponseFactory')来使用它

response()->success();//OK
app('Illuminate\Routing\ResponseFactory')->success();//OK//Response Facade
Response::success();//ok(new \Illuminate\Http\Response)->success();//Error

原理

我们在ServiceProvider里使用Response Facade来注册的success宏,我们先看看Response这个Facade的正真类是什么。

// Illuminate\Support\Facades.phpprotected static function getFacadeAccessor()
{return 'Illuminate\Contracts\Routing\ResponseFactory';
}

Facade返回了一个ResponseFactory接口,那该接口的具体实列对象时什么呢。

//Illuminate\Routing\RoutingServiceProvider.php/*** Register the response factory implementation.** @return void*/
protected function registerResponseFactory()
{$this->app->singleton('Illuminate\Contracts\Routing\ResponseFactory', function ($app) {return new ResponseFactory($app['Illuminate\Contracts\View\Factory'], $app['redirect']);});
}

可以看到,该RoutingServiceProvider注册了一个Illuminate\Routing\ResponseFactory的实列给Response Facade

我们在Illuminate\Routing\ResponseFactory的源码中可以看到,它引用了一个Illuminate\Support\Traits\Macroable trait

namespace Illuminate\Routing;use Illuminate\Support\Traits\Macroable;class ResponseFactory implements FactoryContract
{use Macroable;
}

Trait源码如下,看完源码就知道为什么调用response()就能正常访问success方法了。

trait Macroable
{protected static $macros = [];public static function macro($name, callable $macro){static::$macros[$name] = $macro;}public static function hasMacro($name){return isset(static::$macros[$name]);}public static function __callStatic($method, $parameters){if (! static::hasMacro($method)) {throw new BadMethodCallException("Method {$method} does not exist.");}if (static::$macros[$method] instanceof Closure) {return call_user_func_array(Closure::bind(static::$macros[$method], null, static::class), $parameters);}return call_user_func_array(static::$macros[$method], $parameters);}public function __call($method, $parameters){if (! static::hasMacro($method)) {throw new BadMethodCallException("Method {$method} does not exist.");}if (static::$macros[$method] instanceof Closure) {return call_user_func_array(static::$macros[$method]->bindTo($this, static::class), $parameters);}return call_user_func_array(static::$macros[$method], $parameters);}
}

其实该trait Illuminate\Support\Traits\Macroable在很多地方都有使用,包括FileSystemDatabase-Builder


Response-macros文档---Laravel-China

Laravel响应宏原理相关推荐

  1. laravel基础课程---8、laravel响应和视图(响应是什么)

    laravel基础课程---8.laravel响应和视图(响应是什么) 一.总结 一句话总结: 就是向请求返回的响应数据(一般为html(视图),当然也可以是变量值):所有的路由及控制器必须返回某个类 ...

  2. Vue响应式原理 vue源码(十一)

    前言 看过很多讲响应式的文章,大多都是告诉你们,有Observer,Dep,Wathcer类,Object.definePorperty,先会触发get中的dep.depend收集依赖,然后数据改变时 ...

  3. Vue.js 框架源码与进阶 - Vue.js 源码剖析 - 响应式原理

    文章目录 一.准备工作 1.1 Vue 源码的获取 1.2 源目录结构 1.3 了解 Flow 1.4 调试设置 1.5 Vue 的不同构建版本 1.6 寻找入口文件 1.7 从入口开始 二.Vue ...

  4. 深入浅出 Laravel 路由执行原理

    本文首发于「深入浅出 Laravel 路由执行原理」,转载请注明出处. 这篇文章我们将学习 Laravel 项目中一个很重要的主题 --「路由」. 可以说几乎所有的框架都会涉及到「路由」的处理,简单一 ...

  5. 你不知道的Vue响应式原理

    文章首发于github Blog. 本文根据Vue源码v2.x进行分析.这里只梳理最源码中最主要的部分,略过非核心的一些部分.响应式更新主要涉及到Watcher,Dep,Observer这几个主要类. ...

  6. vue 数组删除 dome没更新_详解Vue响应式原理

    摘要: 搞懂Vue响应式原理! 作者:浪里行舟 原文:深入浅出Vue响应式原理 Fundebug经授权转载,版权归原作者所有. 前言 Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是 ...

  7. Vue.js 深入响应式原理

    深入响应式原理 现在是时候深入一下了!Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是普通的 JavaScript 对象.而当你修改它们时,视图会进行更新.这使得状态管理非常简单直接 ...

  8. vue - 响应式原理梳理(一)

    描述  我们通过一个简单的 Vue应用 来演示 Vue的响应式属性: html:<div id="app">{{message}}</div>js:let ...

  9. Vue 响应式原理(双向数据绑定) 怎样实现 响应式原理?

    Vue 响应式原理(双向数据绑定) 怎样实现 响应式原理? 我们在Vue里面,定义在Data里的属性,叫做响应式属性. 每一个vue组件被创建的时候,同时还有一个对象被创建出来了,这个对象我们是看不到 ...

  10. Vue.js响应式原理

    Vue.js响应式原理 框架 浏览数:659 2017-9-20 关于Vue.js Vue.js是一款MVVM框架,上手快速简单易用,通过响应式在修改数据的时候更新视图.Vue.js的响应式原理依赖于 ...

最新文章

  1. 用C#去除代码的SourceSafe管理
  2. 2021年AI将改变制造业的6大应用趋势
  3. shell脚本之nginx的安装
  4. Disruptor并发框架-1
  5. 使用CNN进行情感分类
  6. linux数组随机数,随机数与数组
  7. bigdecimal比较大小的方法_【初中数学思维训练】第7题——比较大小的常用方法...
  8. 渗透中Meterpreter基本操作和对应的windows上的排查或者现象
  9. python实现图像分割_Python实现投影法分割图像示例(一)
  10. Java异常:选择Checked Exception还是Unchecked Exception?
  11. 在苹果Mac中如何一键转换繁体与简体中文?
  12. PHP做好防盗链的基本思想 防盗链的设置方法
  13. 3S基础知识:MapInfo MapX中如何保存专题地图
  14. Java基础(一):Java集合框架(超详细解析,看完面试不再怕)
  15. 古今地名对照总表 (按笔划数排序,强烈推荐的资料)
  16. 不小心把移动硬盘设置为活动分区后的解决方法
  17. python语言智慧树期末答案_2020智慧树Python语言应用期末答案
  18. cocos-creator使用记录5_发布微信小游戏
  19. 100道积分公式证明(71-100)
  20. 护眼郎与您分享各国如何千方百计帮孩子远离近视

热门文章

  1. PHP+Apache+MySQL+phpMyAdmin在win7系统下的环境配置
  2. 恢复出厂设置 卡住10分钟问题
  3. 如何安装mysql5.7.25流程_linux下安装mysql5.7.25详细教程
  4. (九)洞悉linux下的Netfilteriptables:网络地址转换原理之DNAT
  5. DPDK框架原理简介(0003转)
  6. 内存管理 —— ION
  7. FreeSwitch +fusionpbx安装和基本使用
  8. linux调度器(一)——概述
  9. mysql数据库白羽_Android应用开发Android 友盟推送原理解析
  10. spark中的广播变量与累加器