Laravel 中间件与事件应用教程

news2024/11/15 1:50:57

前言

在 Laravel 框架中,中间件(Middleware)和事件(Events)是两种强大的机制,用于处理 HTTP 请求和应用程序中的特定动作。它们各自有独特的应用场景和优势。本教程将详细介绍中间件和事件的基本概念、区别、应用场景,并提供相应的代码示例。
在这里插入图片描述
在这里插入图片描述

一、中间件(Middleware)

基本概念
中间件为 HTTP 请求提供了一个过滤层,允许你在请求被应用程序处理之前或响应被发送回用户之前执行代码。中间件通常用于执行诸如验证、日志记录、CORS 支持等任务。
在这里插入图片描述

应用场景

  • 登录授权
  • CSRF 保护
  • 日志记录
  • 响应压缩

代码示例:登录授权中间件

首先,通过 Artisan 命令创建一个中间件:

php artisan make:middleware EnsureUserIsAuthenticated

然后,在生成的中间件文件中编写逻辑:

// app/Http/Middleware/EnsureUserIsAuthenticated.php

public function handle($request, Closure $next)
{
    if (!Auth::check()) {
        return redirect('/login');
    }

    return $next($request);
}

Kernel.php 文件中注册中间件:

// app/Http/Kernel.php

protected $routeMiddleware = [
    // ...
    'auth' => \App\Http\Middleware\EnsureUserIsAuthenticated::class,
];

在路由中使用中间件:

Route::get('/protected-route', function () {
    // 只有认证用户才能访问
})->middleware('auth');

日志记录中间件

创建一个日志记录中间件,记录所有请求的详细信息:

// app/Http/Middleware/LogRequest.php

public function handle($request, Closure $next)
{
    // 记录请求信息
    Log::info('Request URL: ' . $request->url());

    return $next($request);
}

注册并应用中间件。

二、事件(Events)

基本概念
事件允许你在应用程序的不同部分之间订阅和监听“动作”的发生。当某个动作发生时,你可以触发一个事件,然后监听器可以响应这个事件并执行代码。这非常适合于解耦应用程序的不同部分。
在这里插入图片描述

应用场景

  • 订单创建后的通知
  • 用户注册后的欢迎邮件
  • 缓存失效

代码示例:消息通知事件

首先,定义一个事件:

php artisan make:event OrderCreated

在事件类中,你可以添加任何需要传递给监听器的数据:

// app/Events/OrderCreated.php

class OrderCreated
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $order;

    public function __construct($order)
    {
        $this->order = $order;
    }
}

然后,创建一个监听器:

php artisan make:listener SendOrderNotification --event=OrderCreated

在监听器中编写发送通知的逻辑:

// app/Listeners/SendOrderNotification.php

public function handle(OrderCreated $event)
{
    // 发送通知逻辑
    Mail::to($event->order->user)->send(new OrderNotification($event->order));
}

EventServiceProvider 中注册事件和监听器:

// app/Providers/EventServiceProvider.php

protected $listen = [
    \App\Events\OrderCreated::class => [
        \App\Listeners\SendOrderNotification::class,
    ],
];

最后,在适当的位置触发事件:

// 假设在某个控制器中
event(new \App\Events\OrderCreated($order));

三、中间件与事件的区别

Laravel中的中间件(Middleware)和事件(Events)系统虽然都是Laravel框架中强大的功能,但它们在设计目的、应用场景以及实现方式上存在着明显的区别。以下是对它们之间区别的详细阐述:

1. 设计目的

中间件(Middleware)

  • 设计目的主要是为了在HTTP请求处理流程中插入一些额外的处理逻辑。
  • 它允许你在请求到达控制器之前或响应发送给客户端之后执行代码。
  • 中间件主要用于处理跨多个请求或路由的通用任务,如身份验证、日志记录、CORS处理等。

事件(Events)

  • 设计目的是为了在应用程序的不同部分之间实现松耦合的通信。
  • 当应用程序中发生特定动作或状态变化时,可以触发一个事件,并通知所有对该事件感兴趣的监听器。
  • 事件系统主要用于解耦应用程序的不同组件,使得它们可以独立地响应事件,而不需要直接相互调用。

2. 应用场景

中间件(Middleware)

  • 适用于需要在请求处理流程中插入额外逻辑的场景。
  • 例如,身份验证中间件可以在请求到达控制器之前检查用户是否已登录;日志记录中间件可以在请求处理完成后记录请求信息。
  • 中间件通常与HTTP请求和响应直接相关。

事件(Events)

  • 适用于需要在应用程序中不同部分之间传递信息或触发响应的场景。
  • 例如,当用户注册成功时,可以触发一个用户注册成功的事件,并通知邮件服务发送欢迎邮件、通知统计服务更新用户数据等。
  • 事件系统不局限于HTTP请求和响应的处理,它可以跨多个请求或会话传递信息。

3. 实现方式

中间件(Middleware)

  • 中间件通常通过定义一个或多个类来实现,这些类包含handle方法。
  • handle方法中,你可以编写处理请求或响应的逻辑,并通过调用$next($request)将请求传递给下一个中间件或控制器。
  • 中间件可以通过全局注册、路由注册或控制器注册等方式应用到应用程序中。

事件(Events)

  • 事件系统通过定义事件类和监听器类来实现。
  • 事件类通常包含与事件相关的数据,而监听器类则包含对事件进行响应的逻辑。
  • 在应用程序中,你可以通过Event facade的dispatch方法触发事件,并自动通知所有注册的监听器。
  • 监听器可以通过在EventServiceProvider中注册来订阅特定的事件。

4. 灵活性

中间件(Middleware)

  • 中间件在处理HTTP请求和响应时提供了较高的灵活性,但通常与当前请求和响应紧密相关。
  • 你可以通过定义多个中间件并指定它们的执行顺序来精细控制请求处理流程。

事件(Events)

  • 事件系统提供了更高的灵活性,允许你在应用程序的不同部分之间传递信息并触发响应。
  • 你可以根据需要创建任意数量的事件和监听器,以处理应用程序中的不同场景。
  • 事件系统还支持广播事件,使得你可以将事件通知给所有订阅了该事件的监听器,无论它们位于应用程序的哪个部分。

总结

综上所述,Laravel中的中间件和事件系统各有其独特的设计目的、应用场景和实现方式。而要掌握Laravel使用Laravel这些都是最基本的技能,因它们共同为Laravel框架提供了强大的功能支持,使得开发者能够构建出更加灵活、可扩展和易于维护的应用程序。使我们代码模块化,便于逻辑解耦,专业的事,专业工具人来做。

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

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

相关文章

网络压缩之稀疏模型设计

通过网络架构的设计来达到减少参数量的效果。等一下 要跟大家介绍深度可分离卷积(depthwise separable convolution)。在讲这个方法之前,先复 习一下CNN。在 CNN 的这种卷积层里面,每一个层的输入是一个特征映射。如图1 所 示&…

Mysql——高可用集群部署

目录 一、源码编译mysql 二、mysql的主从复制 2.1、主从复制 2.2、延迟复制 2.3、慢查询日志 2.4、MySQL的并行复制 三、MySQL半同步模式 四、mysql高可用组复制 五、mysql-router 六、mysql高可用MHA 七、为MHA添加VIP功能 一、源码编译mysql 1、安装依赖 [rootm…

HX711—称重模块

1、简介 HX711 采用了海芯科技集成电路专利技术, 是一款专为高精度电子秤而设计的 24 位 A/D 转 换器芯片。 2、原理图 PCB参考设计原理图 3、模块驱动代码(固件库) 数据读取代码分析 HX711信号读取时序 初始化: 将 PD_SCK&…

C练手题--A snail enters a bar! 【7 kyu】

一、原题 链接:Training on A snail enters a bar! | Codewars Problem Description: A snail is crawling along a rubber band that has an initial length of x units. The snail moves at a constant speed of y units per minute. As the snail crawls from t…

upload-labs靶场通关(附靶场环境)

链接: https://pan.baidu.com/s/1GQP5zthh598A4Mp-WQM4vA 提取码: zovn 环境搭建 步骤一:将环境附件下载到phpstudy_pro\WWW下面修改名字为upload 步骤二:询问绑定地址 第一关 less-1 步骤一:上传一句话木马 步骤二:更改文件名…

昇腾 编程范式 - 矢量编程流水任务设计

昇腾 编程范式 - 矢量编程流水任务设计 flyfish 编程范式简单来说就是不同编程风格或方式的“套路”。按着套路走就可以。 矢量算子编程范式把算子的实现流程分为3个基本任务:CopyOut,Compute,copyout CopyIn负责数据搬入操作, Compute负责…

spring入门(一)spring简介

一、spring简介 Spring技术是JavaEE开发必备技能,企业开发技术选型命中率>90% spring能够简化开发,降低企业级开发的复杂性。框架整合,高效整合其他技术,提高企业级应用开发与运行效率。 主要学习&…

Leetcode3244. 新增道路查询后的最短距离 II

Every day a Leetcode 题目来源:3244. 新增道路查询后的最短距离 II 解法1:贪心 由于题目保证添加的边(捷径)不会交叉,从贪心的角度看,遇到捷径就走捷径是最优的。所有被跳过的城市都不可能再出现在最短…

从人机环境系统的角度看,自下而上和自上而下两种认知方式如何有机地结合使用?...

从具体的“态”到抽象的“势”,从感觉到认知是自下而上的,例如 GPT;反之,则是自上而下的,比如有经验的人。理性偏自下而上,神性(感觉)则自上而下。其中,“态”和“势”是…

[000-01-008].Seata案例应用

业务说明:这里我们创建三个服务,一个订单服务,一个库存服务,一个账户服务。当用户下单时,会在订单服务中创建一个订单,然后通过远程调用库存服务来扣减下单商品的库存;再通过远程调用账户服务来…

如何用命令行工作流做定制化 AI 文献回顾?

(注:本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费) 千万不要把 AI 生成的结果,直接端出去给你的导师,甚至是投稿到出版社。 需求 我最近在 B 站发布了一个视频,叫做《AI…

Redis:Redis性能影响因素

这里写自定义目录标题 一、CPU对Redis的影响二、磁盘对Redis的影响三、网络对Redis的影响四、Swap对Redis的影响 一、CPU对Redis的影响 二、磁盘对Redis的影响 性能建议: 如果是热点场景,建议大家关闭rdb和aof。在SATA和SAS普通盘上,append…

【微服务】springboot 自定义注解+反射+aop实现动态修改请求参数

目录 一、前言 二、动态修改接口请求参数的场景 2.1 动态修改请求参场景汇总 2.1.1 数据格式标准化 2.1.2 安全需要 2.1.3 参数校验与默认值设定 2.1.4 数据隐私保护 2.1.5 适配不同客户端 2.1.6 统计与监控 2.1.7 高级功能特性 三、springboot 使用过滤器和拦截器动…

Mysql8 主从复制主从切换(超详细)

文章目录 1 主从复制1.1 实施前提1.2 主节点配置(在192.168.25.91操作)1.3 从节点配置(在192.168.25.92操作)1.4 创建用于主从同步的用户1.5 开启主从同步1.5 主从同步验证 2 主从切换2.1 实施前提2.2 主节点设置只读(在192.168.25.91操作)2.3 检查主从数据是否同步完毕(在192.…

Vue的冷门内置指令:优化与性能提升的利器

在Vue.js的广阔生态中,开发者们常常聚焦于那些耳熟能详的内置指令,如v-for用于循环渲染列表,v-if和v-else-if用于条件渲染等。然而,Vue还提供了一系列较为冷门但功能强大的内置指令,它们在某些特定场景下能够显著提升应…

ER模型介绍

7.1.概述: 1.ER模型也叫做实体关系模型,是用来描述现实生活中客观存在的事物、事物的属性,以及事物之间关系的一种数据模型。2.在开发基于数据库的信息系统的设计阶段,通常使用ER模型来描述信息需要和信息特性,帮助我…

云平台之Zabbix 监控网站

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

NMPC非线性模型预测控制经验分享与代码实例

NMPC非线性模型预测控制经验分享与代码实例 原本做完本科毕设之后就应该动笔写这一部分,但是做的过程中慢慢意识到自己懂的只是一点点。最近重新接触一些优化相关的问题,希望能够做出我认知之下比较好的解答。本人知识有限,难免写的有问题&am…

ClickHousez中如何定时清理过期数据库?

一、脚本清理 要在ClickHouse中自动删除过期的数据库,你可以使用ClickHouse的SQL命令结合外部脚本(如Shell脚本)和计划任务(如cron)来实现。下面是一个示例,展示如何创建一个Shell脚本来检查数据库的创建时…

1、.Net UI框架:Avalonia UI - .Net宣传系列文章

Avalonia UI是一个开源的跨平台UI框架,它允许开发者使用C#和XAML来创建应用程序,这些应用程序可以在多个平台上运行,包括Windows、macOS、Linux、Android和iOS。Avalonia UI的设计目标是提供一个现代化、可移植的UI框架,它具有类似…