中间件简介

中间件简介

什么是中间件?

中间件是一种软件设计模式,可以实现不同系统、应用程序或服务之间的无缝通信和数据交换。它在促进不同组件之间的交互、添加功能和增强整体系统性能方面发挥着至关重要的作用。

问题

在我们之前的项目中,我们遇到了一个问题,已登录的用户在访问注册页面时被要求重新注册。这是由于缺乏中间件实现,导致用户体验不佳。

PHP 中间件

在PHP中,可以使用中间件来处理用户注册和登录功能,确保流畅的用户体验。中间件充当不同组件之间的桥梁,实现无缝通信和数据交换。

if ($_SESSION['user'] ?? false){     标题('位置:/');     出口(); }

它检查用户是否登录。如果没有,则退出脚本以查找经过身份验证的用户。

路由配置

在routes.php文件中,我们可以向路由添加一个“guest”键,将其与中间件关联起来:

$router->get('/register', 'controllers/registration/create.php')->only('guest');

调试唯一方法

要检查项目是否按预期工作,可以在唯一方法中添加调试语句:

仅限公共函数($key){     dd($key); }

它显示错误,因为唯一的方法不能使用 null 值,因为它与 get 方法关联并且不返回任何值。所以我们必须重写这个方法。

重写Add方法

要将所有值返回到唯一的方法,我们需要将router.php文件中的add方法重写为:

公共函数add($method, $uri, $controller) {     $这个->路线[] = [         'uri' => $uri,         '控制器' => $控制器,         '方法' => $方法,         '中间件'=>空     ];     返回$这个; }

现在我们可以看到该项目运行良好。

唯一方法

router.php 文件中唯一需要修改的方法是接受中间件密钥:

美间AI 美间AI

美间AI:让设计更简单

美间AI 45 查看详情 美间AI

仅限公共函数($key){     $this->routes[array_key_last($this->routes)]['middleware']=$key;     返回$这个; }

中间件检查

在create.php文件中,我们可以使用中间件检查用户是否已登录或访客:

if ($route['middleware']==='guest'){     if($_SESSION['用户'] ?? false){         标题('位置:/');         出口();     } } if ($route['中间件']=='auth'){     if(!$_SESSION['user'] ?? false){         标题('位置:/');         出口();     } }

只有经过身份验证的用户才能访问所有页面,而访客只能访问有限的页面。

创建中间件目录

要组织我们的中间件类,请在核心文件夹中创建一个名为 Middleware 的新目录。因为我们必须在某个时刻做出改变才能放松,以节省我们的精力和时间。通过这个我们可以使我们的项目更容易理解。在此创建 3 个不同的类。

认证中间件

Authenticated.php 文件检查用户是否登录,如果为 true 则重定向到主页:

<?php 命名空间 CoreMiddleware; 已验证类{     公共函数句柄(){         if (!$_SESSION['user'] ?? false) {             标题('位置:/');             出口();         }     } }

访客中间件

Guest.php 文件检查用户是否未登录,如果为 true 则重定向到主页:

<?php 命名空间 CoreMiddleware; 类客人{     公共函数句柄(){         if ($_SESSION['user'] ?? false) {             标题('位置:/');             出口();         }     } }

中间件类

Middleware.php 文件使用 MAP 常量将中间件键映射到各自的类。还检查中间件是否存在。如果没有,则向用户显示未捕获的异常以在项目中添加中间件:

 客人::类,         'auth' => 已验证::类     ];     公共静态函数解析($key){         如果(!$键){             返回;         }         $middleware = static::MAP[$key] ??错误的;         if (!$中间件) {             throw new Exception("未找到键 '{$key}' 的匹配中间件。");         }         (新$中间件)->handle();     } }

现在我们可以看到,通过进行这些更改,我们的项目运行良好。

希望您已经清楚地理解了。

以上就是中间件简介的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/529741.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月9日 09:53:46
下一篇 2025年11月9日 09:54:50

相关推荐

  • Golang如何使用模板方法模式复用流程逻辑

    Go语言通过接口与组合实现模板方法模式,定义Workflow接口声明Step1、Step2、Step3等可变行为,由具体类型如RegisterFlow和OrderFlow实现各自步骤;Template结构体封装通用流程逻辑,其Execute方法作为模板方法固定执行顺序;通过注入不同Workflow实…

    2025年12月16日
    000
  • 如何在Golang中实现中介者模式解耦对象

    中介者模式通过引入中间对象管理多个对象间的交互,降低耦合度。定义Mediator接口规范通信行为,如Send和Receive方法;具体中介者ChatRoom维护同事对象列表并转发消息,避免直接引用。同事对象User通过中介者发送和接收消息,实现解耦。使用时将用户注册到同一中介者,即可实现群聊等场景的…

    2025年12月16日
    000
  • Golang如何实现微服务间消息传递

    微服务间通信首选消息队列实现解耦与可靠传递,Go结合RabbitMQ、Kafka等中间件支持发布/订阅模式;对实时性要求高的场景可用gRPC或HTTP RESTful API;channel用于服务内部goroutine协调,不适用于跨服务通信。 Go语言(Golang)凭借其出色的并发性能和简洁的…

    2025年12月16日
    000
  • Go语言中如何精确统计特定Goroutine的数量

    在Go语言中,`runtime.NumGoroutine()`提供的是所有Goroutine的总数。若需统计特定函数或任务的Goroutine数量,可采用`sync/atomic`包实现。通过在Goroutine的生命周期内原子性地增减计数器,可以准确追踪并获取特定Goroutine的实时运行数量,…

    2025年12月16日
    000
  • Golang微服务通信模式与性能提升示例

    优先使用gRPC实现服务间高效同步通信,利用其HTTP/2、连接复用和Protocol Buffers特性降低延迟;2. 对非实时任务采用RabbitMQ等消息队列异步解耦,提升系统稳定性与可扩展性;3. 结合连接池、批量处理、压缩、超时重试及熔断限流等优化手段增强性能;4. 架构上对外提供REST…

    2025年12月16日
    000
  • Golang单元测试表单解析功能实践

    首先确保正确设置Content-Type头,然后使用httptest.NewRequest构造含表单数据的请求;通过覆盖正常及错误场景(如缺失字段、类型错误)验证ParseUserFromForm函数的健壮性,结合标准库测试工具保障解析逻辑稳定。 在Go语言开发中,处理表单数据是Web服务的常见需求…

    2025年12月16日
    000
  • 如何在Golang中处理表单多字段验证

    答案:在Golang中处理表单多字段验证需结合结构体绑定与错误反馈,可使用%ignore_a_1%手动验证或第三方库如go-playground/validator提升效率。通过ParseForm解析数据并映射到结构体,手动检查字段有效性,适用于简单场景;对于复杂项目,推荐使用validator库,…

    2025年12月16日
    000
  • Golang如何使用自定义error实现业务逻辑校验

    定义自定义error类型可提升Go语言业务逻辑校验的清晰度与可维护性,通过结构体封装错误码、消息等信息,如用户注册校验中返回ErrInvalidEmail、ErrUserExists等预定义错误,便于调用方识别处理。 在Go语言中,错误处理是通过返回error类型来实现的。为了更好地表达业务逻辑校验…

    2025年12月16日
    000
  • 如何在Golang中实现简单的用户认证功能

    使用Golang实现用户认证需定义User结构体并用map模拟存储;2. 通过bcrypt哈希密码保障安全;3. 利用JWT生成带签名的令牌用于身份验证;4. 提供注册登录接口完成用户管理;5. 设计中间件校验JWT以保护受限制路由。 在Golang中实现简单的用户认证功能,核心是处理用户注册、登录…

    2025年12月16日
    000
  • 如何在Golang中实现模板方法模式标准化流程

    答案是通过接口和组合实现模板方法模式。定义Workflow接口规范步骤,Template结构体封装执行流程,具体类型如UserRegistration和OrderProcess实现各自步骤,客户端通过依赖注入调用统一Execute方法,确保流程一致性,避免重复代码,提升灵活性。 在Golang中实现…

    2025年12月16日
    000
  • 如何在Golang中实现微服务架构

    答案:Golang微服务需合理划分服务边界,采用gRPC或HTTP通信,结合服务发现、配置管理、容错机制及可观测性设计。具体包括:基于DDD拆分业务,使用Protobuf定义接口,通过Consul或etcd实现服务注册与发现,利用环境变量或Vault集中管理配置,集成gobreaker实现熔断、重试…

    2025年12月16日
    000
  • Golang微服务事件总线设计与消息分发实践

    事件总线通过发布/订阅机制实现服务解耦,提升系统灵活性与稳定性;其核心设计包括类型安全、松耦合、可扩展性与错误隔离;结合NSQite可实现可靠的消息分发,支持主题与通道分离、并发消费、异步发布及持久化重试,适用于用户注册等典型场景,使各服务独立演进,架构更清晰易维护。 在构建高并发、可扩展的Gola…

    2025年12月16日
    000
  • 如何在Golang中实现表单验证

    使用结构体标签与反射可实现基础表单验证,如定义含validate标签的User结构体并解析执行规则;推荐使用go-playground/validator库进行高效验证,支持required、email等内置规则及自定义逻辑;在Gin框架中结合binding标签与ShouldBind方法可自动校验请…

    2025年12月16日
    000
  • Golang并发Web表单处理项目

    使用sync.Mutex保护共享数据,确保并发安全;通过表单验证、去重机制和上下文超时提升安全性与性能;利用Golang的goroutine模型处理高并发注册请求,结合压力测试验证系统稳定性。 处理Web表单时的并发问题在Golang中很常见,尤其是在高并发场景下,比如用户注册、登录、数据提交等。一…

    2025年12月16日
    000
  • 微服务消息队列异步通信实践

    异步通信通过消息队列解耦服务、提升性能、实现故障隔离与削峰填谷,在订单创建等场景中避免同步阻塞。主流选型包括RabbitMQ(高可靠)、Kafka(高吞吐)、RocketMQ(金融级可靠),需根据业务需求选择。关键实践为:采用事务性发件箱防止消息丢失,配置死信队列处理消费失败,确保系统可靠性。 微服…

    2025年12月16日
    000
  • 如何在Golang中处理JSON请求与响应

    Go通过encoding/json和net/http包处理JSON,需定义可导出字段的结构体并用tag映射JSON键名,解析时检查Content-Type并用json.NewDecoder读取请求体,返回时设置Header为application/json并用json.NewEncoder输出,支持…

    2025年12月16日
    000
  • 如何在Golang中实现Web表单数据校验

    Golang中Web表单校验可通过手动检查、结构体标签或框架集成实现。首先使用net/http解析表单,逐项校验字段合法性,适合简单场景但维护性差;推荐将表单映射为结构体并结合go-playground/validator库,通过validate标签声明规则,提升代码可读性与扩展性;进一步可选用Gi…

    2025年12月16日
    000
  • Golang Observer事件订阅与通知模式示例

    观察者模式在Go中通过接口和切片实现,用于解耦事件发布与处理;示例中Subject维护Observer列表,支持动态订阅与通知,适用于消息广播、状态更新等场景。 在Go语言中,Observer(观察者)模式是一种常用的设计模式,适用于事件驱动的场景,比如消息通知、状态变更广播等。该模式定义了对象之间…

    2025年12月16日
    000
  • 如何使用Golang编写集成测试

    集成测试重点是验证多组件协同行为,需使用真实依赖如数据库和HTTP服务。1. 区分单元与集成测试,文件命名用*_integration_test.go;2. 用//go:build integration标签控制执行;3. TestMain中启动服务并等待,注意端口配置;4. setup/teard…

    2025年12月16日
    000
  • 如何使用Golang处理云原生事件驱动

    Golang结合NATS/Kafka与client-go监听Kubernetes事件,使用CloudEvents标准实现云原生事件驱动架构,通过goroutine并发处理、幂等设计及Prometheus监控保障可靠性。 在云原生环境中,事件驱动架构(Event-Driven Architecture…

    2025年12月16日
    000

发表回复

登录后才能评论
关注微信