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

文章目录

  • 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 model

import (
	"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   // 用户ID
	Passport string // 用户账号
	Nickname string // 用户名称
	Avatar   string // 用户头像
}

逻辑封装

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

新建logic/context/context.go文件

├── logic
│   │   ├── context
│   │   │   └── context.go
│   │   └── logic.go
package context

import (
	"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 middleware

import (
	"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.mfbz.cn/a/609268.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI写的论文AI疑似度太高怎么办?教你一招解决

随着 AI 技术迅猛发展,各种AI辅助论文写作的工具层出不穷! 为了防止有人利用AI工具进行论文代写,在最新的学位法中已经明确规定“已经获得学位者,在获得该学位过程中如有人工智能代写等学术不端行为,经学位评定委员会…

易基因:Nature子刊:ChIP-seq等揭示c-di-AMP与DasR互作以调控细菌生长、发育和抗生素合成|项目文章

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 c-di-AMP是一种在细菌信号中普遍存在且至关重要的核苷酸第二信使,对于大多数c-di-AMP合成生物体来说,c-di-AMP稳态及其信号转导的分子机制非常值得关注。 2024年…

智慧仓储可视化大屏,以最直观的形式展示海量数据。

智慧仓储可视化大屏是一种通过数据可视化技术,将仓储管理系统中的海量数据以图表、地图、仪表盘等形式直观展示在大屏上的解决方案。它可以帮助仓储管理人员更清晰地了解仓库的运营情况,从而做出更明智的决策。 智慧仓储可视化大屏通常包括以下功能和特点…

护眼灯有没有护眼的效果?六大技巧教你选到护眼效果好的护眼台灯

随着孩子学习压力增大,护眼灯的重要性日益凸显。那么,护眼灯有没有护眼的效果?答案是肯定的,但关键在于如何挑选。本文将分享六大选购技巧,帮助大家挑选到护眼效果卓越的台灯,确保孩子在明亮而舒适的光线下…

论文AI疑似度太高怎么办?教你一招解决AIGC降重问题

随着 AI 技术迅猛发展,各种AI辅助论文写作的工具层出不穷! 为了防止有人利用AI工具进行论文代写,在最新的学位法中已经明确规定“已经获得学位者,在获得该学位过程中如有人工智能代写等学术不端行为,经学位评定委员会…

苹果15能用哪些充电宝?充电宝什么牌子好?好用充电宝排名

随着移动设备的普及和功能的不断强大,我们对于充电宝的需求也越来越高。尤其是对于苹果15用户来说,选择一款兼容性好、性能稳定的充电宝显得尤为重要。在市面上众多充电宝品牌中,如何选择适合苹果15的充电宝?究竟哪个牌子的充电宝…

【密评】 | 商用密码应用安全性评估从业人员考核题库(7/58)

量子密钥分发(QKD)技术采用()作为信息载体,经由量子通道在合法的用户之间传送密钥。 A. 数据 B. 电流 C. 量子态 D. 文本 置换(permutation)密码是把明文中的各字符()得…

tag-字符串:最长公共前缀

题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 示例 题解一 class Solution:def longestCommonPrefix(self, strs: List[str]) -> str:# 按照字典顺序找到strs中最大的字符串和最小的字符串str0 min(strs)st…

深入了解二叉搜索树:原理、操作与应用

文章目录 二叉搜索树二叉搜索树的操作1.查找操作2.插入操作3.查找最大值或者最小值4.删除操作5.前序中序后序遍历 总结 二叉搜索树 形如上图的二叉树就是二叉搜索树,接下来我们来具体阐述一下什么是二叉搜索树。 二叉搜索树的概念:满足左子树的值小于根…

winform图书销售管理系统+mysql

winform图书销售管理系统mysql数据库说明文档 运行前附加数据库.mdf(或sql生成数据库) 功能模块: 管理员:ttt 123 登陆可以操作我的 个人信息 修改密码 用户信息 添加删除用户 图书 添加删除图书信息 购物车 购买订单信息 充值 退出账户 …

网络安全之弱口令与命令爆破(下篇)(技术进阶)

目录 一,什么是弱口令? 二,为什么会产生弱口令呢? 三,字典的生成 四,九头蛇(hydra)弱口令爆破工具 1,破解ssh登录密码 2,破解windows登录密码 3&#xf…

Cesium的使用和特点

Cesium 是一款开源的 JavaScript 库,用于在 Web 上可视化地理空间数据。它广泛用于创建 3D 地球、地图和其他地理空间应用程序。Cesium 具有以下特点使其成为地理空间开发的流行选择。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交…

华为OD机试 - 手机App防沉迷系统(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷C卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试…

git合并分支

1、vscode安装插件Git Graph 2、点击右下角分支,比如要把dev分支合并到其他分支 首先dev分支的全部提交了,然后切换到其他分支 3、选择被合并的分支 点提交就好了

中医课堂丨名医面对面,金保方教授专场健康科普交流圆满举行

5月8日下午,李良济特邀金保方教授,在苏州太湖国际高尔夫俱乐部,以“生殖健康漫谈”为主题开展专场科普交流活动,参与的嘉宾表示受益匪浅,反响强烈。 本次活动主要包含了专家讲座、专家答疑义诊,现在就让我…

Java基础编程(高级部分)

1. 类变量和类方法 1.1 什么是类变量 类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值同样任何一个该类的对象去修改它时,修改的也是同一个变量。 1.2 定义类变量 1.3 访问类变量 类名.类变量名 或者 对…

【GD32H757Z海棠派使用手册】第七讲 FWDG-看门狗实验

7.1 实验内容 通过本实验主要学习以下内容: 独立看门狗的原理 独立看门狗功能介绍 实现独立看门狗功能 7.2 实验原理 7.2.1 看门狗的原理 一般来说,搭配MCU的产品都需要有长期运行的需求,特别像一些工业设备,可能要求运行个…

微信团队开源的跨平台数据库框架 | 开源日报 No.249

Tencent/wcdb Stars: 10.4k License: NOASSERTION wcdb 是由微信开发的跨平台数据库框架。 该项目主要功能、关键特性、核心优势包括: 易于使用ORM(对象关系映射)WINQ(WCDB 语言集成查询)高效性能多线程并发支持完备…

element ui的无法关掉的提示弹框

使用element的$alert组件的属性把X去掉和确定按钮和取消按钮去掉; import { MessageBox } from element-ui; MessageBox.alert(AI功能已到期或暂未开启, 友情提示, {showClose: false,showCancelButton: false,showConfirmButton: false }); 如果在router的路由守…

QX------mini51单片机学习------(5)数码管的静态与动态显示

目录 1数码管应用场景 2数码管显示原理 3静态与动态显示 474HC573锁存器工作原理 5上拉电阻的作用 6原理图分析 7实践 1数码管应用场景 2数码管显示原理 图(b)左边是共阴极,右边是共阳极 GND是公共极,可以用万用表测&am…