laravel(源码笔记)中间件解析过程

装饰器

1. 和继承对比:

  1. 嵌套方式,可控制添加行为的方法和时机

2. 实现:

1. Component抽象类,方便动态添加职责
2. ConcreteComponent Component的实现类
3. Decorator,装饰器的抽象类,接受Component,并维持这个实例,并且定义和component一致的接口。
4. ConcreteDecoratorA, ConcreteDecoratorB。装饰器的具体实现类。
5. 使用```php$component = new ConcreteComponent();$decoratorA = new ConcreteDecoratorA($component);$decoratorB = new ConcreteDecoratorB($decoratorA);$decoratorB->operation();```

3. 装饰模式需要注意的问题

一个装饰类的接口必须与被装饰类的接口保持相同,对于客户端来说无论是装饰之前的对象还是装饰之后的对象都可以一致对待。
尽量保持具体组件类ConcreteComponent的轻量,不要把主逻辑之外的辅助逻辑和状态放在具体组件类中,可以通过装饰类对其进行扩展。 
如果只有一个具体组件类而没有抽象组件类,那么抽象装饰类可以作为具体组件类的直接子类。

4. 适用环境

需要在不影响组件对象的情况下,以动态、透明的方式给对象添加职责。
当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时可以考虑使用装饰类。

中间件(理解洋葱模式的包装和解析过程)

  1. sendRequestThroughRouter
  2. then/getInitialSlice firstSlice = call_user_func($destination, $passable); 第一次循环
  3. return call_user_func(array_reduce($pipes, $this->getSlice(), $firstSlice), $this->passable);
  4. getSlice 是个闭包(重点理解这里,array_reduce函数,对getSlice()闭包不断解开,应用到pipes上)
  5. return call_user_func( s l i c e ( slice( slice(stack, $pipe), $passable),这句解开后其实就是父类的getSlice函数
  6. 父类getSlice 核心逻辑代码。
    1. 是闭包,返回对闭包调用请求
    2. 不是对象,解析中间件,得到中间件名称和参数,设置中间件为实例化的中间件,合并中间件参数到基本参数数组中作为最后的参数,进入步骤4(比如中间件为’throttle:60,1’)
    3. 其他,设置参数 p a r a m e t e r s = [ parameters=[ parameters=[passable(请求),$stack(每次请求的结果)] (可能为对象,直接调用就好)
    4. 调用中间的handle方法处理参数$parameters
  7. next的过程待补充

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/763393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用docker搭建Fluentd的教程

使用Docker搭建Fluentd的教程 步骤 1: 拉取Fluentd镜像 首先,需要从Docker Hub上拉取Fluentd的官方镜像: docker pull fluent/fluentd:v1.14-debian-1这里使用的是基于Debian的Fluentd 1.14版本的镜像,可以根据需要选择其他版本。 步骤 2…

软考 网络工程师 每日学习打卡 2024/3/22

学习内容 第9章 网络操作系统与应用服务器 本章主要讲解:了Windows和Linux操作系统的基础知识,并详细讲述了常用的各种服务器的 配置方法。这一章的内容主要是在具体操作方面,网络工程师要能够熟练地配置各种网络服务 器,排除网络…

(2024,Mamba,DiT,之字扫描与空间连续性)ZigMa:之字形 Mamba 扩散模型

ZigMa: Zigzag Mamba Diffusion Model 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 1. 简介 2. 相关工作 3. 方法 3.1 背景:状态空间模型 3.2 扩散主干&…

6.shell case控制语句

case控制语句 1.什么是case case条件语句相当于多分支的if/elif/else条件语句,主要还是用来做条件判断的,常被应用于实现系统服务启动脚本。 case语句中,会将case获取的变量值与表达式部分的值1、值2、值3等逐个进行比较,如果变量值和某个表…

【算法刷题】Day33

文章目录 1. 最长湍流子数组题干:算法原理:1. 状态表示:2. 状态转移方程3. 初始化4. 填表顺序5. 返回值 代码: 2. 最长递增子序列题干:算法原理:1. 状态表示:2. 状态转移方程3. 初始化4. 填表顺…

Postgres正在蚕食数据库世界

PostgreSQL 不仅仅是一个简单的关系数据库;它是一个数据管理框架,有可能吞没整个数据库领域。 “一切皆用 Postgres”的趋势不再局限于少数精英团队,而是正在成为主流最佳实践。 OLAP 的新挑战者 PostgreSQL 生态系统中的一个重大差距是缺乏…

自学Python第二十九天-feapder框架创建爬虫

自学Python第二十九天-feapder框架创建爬虫 安装feapder 的设计架构feapder 框架的简单使用简单创建爬虫简单爬取数据简单的数据保存 中间件校验浏览器渲染使用浏览器渲染获取接口数据 feapder 项目 feapder是一款上手简单,功能强大的 Python爬虫框架,内…

鸿蒙Harmony应用开发—ArkTS-全局UI方法(日期滑动选择器弹窗)

根据指定的日期范围创建日期滑动选择器,展示在弹窗上。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 本模块功能依赖UI的执行上下文,不可在UI上下文不明确的地方使用&…

【JS】如何避免输入中文拼音时触发input事件

现有一段代码&#xff0c;监听input事件。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" con…

SpringBoot+Vue项目(后端项目搭建 + 添加家居)

文章目录 1.使用版本控制管理该项目1.创建远程仓库2.克隆到本地 2.后端项目环境搭建1.创建一个maven项目2.删除不必要的文件夹3.pom.xml文件引入依赖4.application.yml 配置数据源&#xff08;注意&#xff0c;数据库名还没写&#xff09;5.com/sun/furn/Application.java 编写…

Xshell使用与学习

VPN情况下&#xff1a; ubuntu&#xff1a;查看ubuntu系统的版本信息 (base) xxxxxx-ThinkCentre-E97:~$ cat /proc/version Linux version 5.15.0-91-generic (builddlcy02-amd64-061) (gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0, GNU ld (GNU Binutils for Ubuntu) 2.3…

蓝桥杯算法心得——游戏(优先队列)

大家好&#xff0c;我是晴天学长&#xff0c;优先队列的题&#xff0c;式子化简非常重要&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .游戏 2) .算法思路 附近最小 1.接收数据 2.找出最小的&#…

安防监控平台EasyCVR使用管理员权限登录后,平台菜单栏显示不全是什么原因?

安防视频监控系统EasyCVR视频综合管理平台&#xff0c;采用了开放式的网络结构&#xff0c;平台能在复杂的网络环境中&#xff08;专网、局域网、广域网、VPN、公网等&#xff09;将前端海量的设备进行统一集中接入与视频汇聚管理&#xff0c;平台支持设备通过4G、5G、WIFI、有…

I2C协议

一.硬件连接 I2C必须使用开漏&#xff08;或集电极开路&#xff09;的引脚&#xff0c;其引脚框图如下所示。 SCL0对应78K0的P6.0引脚&#xff0c;SDA0对应78K0的P6.1引脚。 在使用开漏引脚通信时&#xff0c;需注意如下事项&#xff1a; 1&#xff09;两条总线须外接…

【Java - API - 多线程】(01) 通过Java 8完成多线程的创建,快速上手

通过"Java 8"完成多线程的创建&#xff0c;快速上手&#xff1b; 实操 【前提】 使用"Windows 11"系统通过"IntelliJ IDEA"软件完成&#xff1b; 【目录】 “方式1”&#xff1a;通过继承"Thread"完成-正常操作&#xff1b;“方式2”…

【QT入门】 Qt自定义信号后跨线程发送信号

往期回顾&#xff1a; 【QT入门】 lambda表达式(函数)详解-CSDN博客 【QT入门】 Qt槽函数五种常用写法介绍-CSDN博客 【QT入门】 Qt实现自定义信号-CSDN博客 【QT入门】 Qt自定义信号后跨线程发送信号 由于Qt的子线程是无法直接修改ui&#xff0c;需要发送信号到ui线程进行修改…

【Unity投屏总结】投屏方案总结

【背景】 想方便自己在VR中工作&#xff0c;打算做一个能够挂多个屏幕的远程控制VR桌面。研究下来发现细分场景有很多&#xff0c;有点鱼和熊掌不可兼得的意味&#xff0c;细分如下。 【投屏场景与解决方案】 希望多人能够同时观看我的屏幕&#xff0c;也就是一屏投多屏&…

C语言知识复盘— 递归算法 | 函数 | 数组

递归 ○ 算法思想&#xff1a; 递归算法分为两大阶段 : 递和归&#xff0c;即就是有去&#xff08;递去&#xff09;有回&#xff08;归来&#xff09;。 递去&#xff1a;将递归问题分解为若干个规模较小,与原问题形式相同的子问题,这些子问题可以用相同的解题思路来解决。归…

spring cloud项目微服务间互相调用使用自定义标注进行鉴权方案

来吧&#xff0c;贴代码。 一、背景 我们有一个项目使用了spring cloud&#xff0c;有的微服务需要调用别的微服务&#xff0c;但这些调用没有鉴权&#xff1b;当初项目时间非常紧&#xff0c;同时这部分微服务有的对外也没有鉴权&#xff0c;在代码中设置了无须鉴权&#xf…

C语言中goto

在C语言中,goto语句可用于从程序中的一个位置直接跳转到另一个带有标签的位置。虽然goto语句提供了一些流程控制的灵活性,但它也被认为是一种不好的编程习惯,因为它可能会导致代码难以阅读和维护。 下面是goto语句的基本语法: goto label; ... ... label: statement;在这个示…