Goframe学习笔记(六)上下文共享变量

news/2024/10/22 16:38:46/

文章目录

  • Context
    • 结构定义
    • 逻辑封装
    • 上下文变量注入
    • 上下文变量使用

官方文档: Context: 业务流程共享变量 - GoFrame (ZH)-Latest - GoFrame官网 - 类似PHP-Laravel, Java-SpringBoot的Go企业级开发框架

Context

在Go的执行流程中,不存在全局变量这种获取请求参数的方式,但可以通过上下文Context将所有需要传递的共享变量传递到后续流程的方法中。

结构定义

结构体中需要包含业务中传递的信息,这里包含了会话(Session)、用户信息(User)以及一个键值对映射(Data)。

新建model/context.go文件:

├── model
│   |   ├── do
│   │   ├── entity
│   │   └── context.go
package modelimport ("github.com/gogf/gf/v2/frame/g""github.com/gogf/gf/v2/net/ghttp"
)const (// 上下文变量存储键名,前后端系统共享ContextKey = "ContextKey"
)// 请求上下文结构
type Context struct {Session *ghttp.Session // 当前Session管理对象User    *ContextUser   // 上下文用户信息Data    g.Map          // 自定KV变量,业务模块根据需要设置,不固定
}// 请求上下文中的用户信息
type ContextUser struct {Id       uint   // 用户IDPassport string // 用户账号Nickname string // 用户名称Avatar   string // 用户头像
}

逻辑封装

封装上下文的相关操作。这包括初始化上下文、获取上下文和设置用户信息等功能。

新建logic/context/context.go文件

├── logic
│   │   ├── context
│   │   │   └── context.go
│   │   └── logic.go
package contextimport ("context""demo/internal/model""demo/internal/service""github.com/gogf/gf/v2/net/ghttp"
)func init() {service.RegisterContext(New())
}type sContext struct{}func New() *sContext {return &sContext{}
}// 初始化上下文对象指针到上下文对象中,以便后续的请求流程中可以修改。
func (s *sContext) Init(r *ghttp.Request, customCtx *model.Context) {r.SetCtxVar(model.ContextKey, customCtx)
}// 获得上下文变量,如果没有设置,那么返回nil
func (s *sContext) Get(ctx context.Context) *model.Context {value := ctx.Value(model.ContextKey)if value == nil {return nil}if localCtx, ok := value.(*model.Context); ok {return localCtx}return nil
}// 将上下文信息设置到上下文请求中,注意是完整覆盖
func (s *sContext) SetUser(ctx context.Context, ctxUser *model.ContextUser) {s.Get(ctx).User = ctxUser
}

上下文变量注入

上下文变量的注入通过定义一个中间件来实现。这个中间件在请求的最开始执行,用于初始化上下文,将请求中携带的参数置入结构体中,以便后续的处理函数可以便捷调用。

新建logic/middleware/middleware.go文件

├── logic
│   │   ├── context
│   │   ├── middleware
│   │   │   └── middleware.go
│   │   └── logic.go
package middlewareimport ("demo/internal/model""demo/internal/service""github.com/gogf/gf/v2/frame/g""github.com/gogf/gf/v2/net/ghttp"
)type sMiddleware struct{}func init() {service.RegisterMiddleware(New())
}func New() *sMiddleware {return &sMiddleware{}
}func (*sMiddleware) Ctx(r *ghttp.Request) {// 初始化,务必最开始执行customCtx := &model.Context{Session: r.Session,Data:    make(g.Map),}service.Context().Init(r, customCtx)// TODO 获取用户信息// ...// 将自定义的上下文对象传递到模板变量中使用r.Assigns(g.Map{"Context": customCtx,})// 执行下一步请求逻辑r.Middleware.Next()
}

上下文变量使用

约定方法定义的第一个输入参数预留给context.Context类型参数使用,以便接受上下文变量。例如:

func (s *xxx) func1(ctx context.Context, xxxxReq *xxx.xxxxReq) error {...
}

可以通过以下方式获取上下文:

service.Context().Get(ctx)

可以通过 Data 字段存储和获取自定义的键值对数据:

// 设置自定义键值对
service.Context.Get(ctx).Data[key] = value
// 获取自定义键值对
service.Context.Get(ctx).Data[key]

http://www.ppmy.cn/news/1459454.html

相关文章

vue3+ant design实现表格数据导出Excel

提示:实现表格数据导出Excel 文章目录 前言 一、安装ant design? 二、引用ant design 1.搭建框架 2.获取表格数据 三、封装导出表格的代码 四、导出 1.获取导出地址 2.在下载导出事件中添加导出代码 五、全部代码 前言 今天终于有时间来更新文章了,最近公司项目比较紧…

信息系统安全与对抗-网络侦查技术与网络扫描技术(期末复习简答题)

1、网络拓扑结构在网络攻击中的作用 查明目标网络的拓扑结构,有利于找到目标网络的关键节点,从而提高攻击效率,达到最大攻击效果。 2、网络侦查在网络攻击中的作用 识别潜在目标系统,确认目标系统适合哪种类型的攻击。 3、百度…

[Kubernetes] 云原生 Istio 介绍

文章目录 1.Istio 介绍2.Istio 特征3.Istio 与服务治理4.Istio与Kubernetes4.1 Istio是Kubernetes的好帮手4.2 Kubernetes是Istio的好基座 5.Istio与服务网格5.1 时代选择服务网格5.2 服务网格选择Istio 1.Istio 介绍 服务网格是一个独立的基础设施层,用来处理服务之…

力扣HOT100 - 739. 每日温度

解题思路&#xff1a; 单调栈 class Solution {public int[] dailyTemperatures(int[] temperatures) {int length temperatures.length;int[] ans new int[length];Deque<Integer> stack new LinkedList<>();for (int i 0; i < length; i) {int temperatu…

数据结构-自定义栈、队列、二分查找树、双向链表

/*** 底层是数组*/ public class MyStack {private long [] arr; // 底层是数组private int top -1; // 核心【栈顶的索引&#xff08;指针&#xff09;】public MyStack() {super();arr new long[10];}public MyStack(int capacity) {super();arr new long[capacity]; // 自…

鸿蒙内核源码分析(信号量篇) | 谁在负责解决任务的同步

基本概念 信号量&#xff08;Semaphore&#xff09; 是一种实现任务间通信的机制&#xff0c;可以实现任务间同步或共享资源的互斥访问。 一个信号量的数据结构中&#xff0c;通常有一个计数值&#xff0c;用于对有效资源数的计数&#xff0c;表示剩下的可被使用的共享资源数…

Spring如何控制Bean的加载顺序

前言 正常情况下&#xff0c;Spring 容器加载 Bean 的顺序是不确定的&#xff0c;那么我们如果需要按顺序加载 Bean 时应如何操作&#xff1f;本文将详细讲述我们如何才能控制 Bean 的加载顺序。 场景 我创建了 4 个 Class 文件&#xff0c;分别命名为 FirstInitialization Se…

如何使用dockerfile文件将项目打包成镜像

要根据Dockerfile文件来打包一个Docker镜像&#xff0c;你需要遵循以下步骤。这里假设你已经安装了Docker环境。 1. 准备Dockerfile 确保你的Dockerfile文件已经准备就绪&#xff0c;并且位于你希望构建上下文的目录中。Dockerfile是一个文本文件&#xff0c;包含了用户可以调…