Laravel响应宏原理
使用场景
我们在使用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
提供了一个非常方便的响应宏
来处理这一情况
首先,我们需要先注册一个响应宏,在任意一个ServiceProvider
的boot
方法里(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
在很多地方都有使用,包括FileSystem
、Database-Builder
。
Response-macros文档---Laravel-China
Laravel响应宏原理相关推荐
- laravel基础课程---8、laravel响应和视图(响应是什么)
laravel基础课程---8.laravel响应和视图(响应是什么) 一.总结 一句话总结: 就是向请求返回的响应数据(一般为html(视图),当然也可以是变量值):所有的路由及控制器必须返回某个类 ...
- Vue响应式原理 vue源码(十一)
前言 看过很多讲响应式的文章,大多都是告诉你们,有Observer,Dep,Wathcer类,Object.definePorperty,先会触发get中的dep.depend收集依赖,然后数据改变时 ...
- Vue.js 框架源码与进阶 - Vue.js 源码剖析 - 响应式原理
文章目录 一.准备工作 1.1 Vue 源码的获取 1.2 源目录结构 1.3 了解 Flow 1.4 调试设置 1.5 Vue 的不同构建版本 1.6 寻找入口文件 1.7 从入口开始 二.Vue ...
- 深入浅出 Laravel 路由执行原理
本文首发于「深入浅出 Laravel 路由执行原理」,转载请注明出处. 这篇文章我们将学习 Laravel 项目中一个很重要的主题 --「路由」. 可以说几乎所有的框架都会涉及到「路由」的处理,简单一 ...
- 你不知道的Vue响应式原理
文章首发于github Blog. 本文根据Vue源码v2.x进行分析.这里只梳理最源码中最主要的部分,略过非核心的一些部分.响应式更新主要涉及到Watcher,Dep,Observer这几个主要类. ...
- vue 数组删除 dome没更新_详解Vue响应式原理
摘要: 搞懂Vue响应式原理! 作者:浪里行舟 原文:深入浅出Vue响应式原理 Fundebug经授权转载,版权归原作者所有. 前言 Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是 ...
- Vue.js 深入响应式原理
深入响应式原理 现在是时候深入一下了!Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是普通的 JavaScript 对象.而当你修改它们时,视图会进行更新.这使得状态管理非常简单直接 ...
- vue - 响应式原理梳理(一)
描述 我们通过一个简单的 Vue应用 来演示 Vue的响应式属性: html:<div id="app">{{message}}</div>js:let ...
- Vue 响应式原理(双向数据绑定) 怎样实现 响应式原理?
Vue 响应式原理(双向数据绑定) 怎样实现 响应式原理? 我们在Vue里面,定义在Data里的属性,叫做响应式属性. 每一个vue组件被创建的时候,同时还有一个对象被创建出来了,这个对象我们是看不到 ...
- Vue.js响应式原理
Vue.js响应式原理 框架 浏览数:659 2017-9-20 关于Vue.js Vue.js是一款MVVM框架,上手快速简单易用,通过响应式在修改数据的时候更新视图.Vue.js的响应式原理依赖于 ...
最新文章
- 用C#去除代码的SourceSafe管理
- 2021年AI将改变制造业的6大应用趋势
- shell脚本之nginx的安装
- Disruptor并发框架-1
- 使用CNN进行情感分类
- linux数组随机数,随机数与数组
- bigdecimal比较大小的方法_【初中数学思维训练】第7题——比较大小的常用方法...
- 渗透中Meterpreter基本操作和对应的windows上的排查或者现象
- python实现图像分割_Python实现投影法分割图像示例(一)
- Java异常:选择Checked Exception还是Unchecked Exception?
- 在苹果Mac中如何一键转换繁体与简体中文?
- PHP做好防盗链的基本思想 防盗链的设置方法
- 3S基础知识:MapInfo MapX中如何保存专题地图
- Java基础(一):Java集合框架(超详细解析,看完面试不再怕)
- 古今地名对照总表 (按笔划数排序,强烈推荐的资料)
- 不小心把移动硬盘设置为活动分区后的解决方法
- python语言智慧树期末答案_2020智慧树Python语言应用期末答案
- cocos-creator使用记录5_发布微信小游戏
- 100道积分公式证明(71-100)
- 护眼郎与您分享各国如何千方百计帮孩子远离近视
热门文章
- PHP+Apache+MySQL+phpMyAdmin在win7系统下的环境配置
- 恢复出厂设置 卡住10分钟问题
- 如何安装mysql5.7.25流程_linux下安装mysql5.7.25详细教程
- (九)洞悉linux下的Netfilteriptables:网络地址转换原理之DNAT
- DPDK框架原理简介(0003转)
- 内存管理 —— ION
- FreeSwitch +fusionpbx安装和基本使用
- linux调度器(一)——概述
- mysql数据库白羽_Android应用开发Android 友盟推送原理解析
- spark中的广播变量与累加器