Laravel中间件用途?中间件怎样创建注册?

发布时间 - 2025-09-14 00:00:00    点击率:
Laravel中间件通过管道模式在请求和响应前后进行拦截处理,可用于身份验证、日志记录、数据预处理等;创建时使用Artisan命令生成类并实现handle方法,注册时可全局配置或在路由中通过别名使用。

Laravel中间件就像是请求抵达你的应用核心业务逻辑之前和响应离开之前的一个个检查站或处理环节。它的主要用途是在请求真正被控制器处理前,或者响应发给用户前,对请求或响应进行拦截、检查、修改等操作。比如,你可以用它来验证用户身份、记录日志、压缩响应,或者在请求中注入一些数据。至于创建和注册,它其实很简单,就是写一个PHP类实现

handle
方法,然后在
App\Http\Kernel.php
里配置一下就行。

说起Laravel中间件,我个人觉得它是框架里一个非常精妙的设计,它把那些横切关注点(cross-cutting concerns)处理得非常优雅。想想看,如果每次处理用户请求都要手动检查登录状态、权限,或者每次返回数据都要统一格式化,那代码会变得多么臃肿和难以维护。中间件就是来解决这个痛点的。

它的核心思想是“管道”(Pipeline)模式。一个请求进来,会依次通过你定义的中间件,每个中间件都可以决定是继续传递请求,还是直接终止并返回响应。这种模式让我们的业务逻辑可以更专注于核心任务,而把那些非核心但又必要的逻辑剥离出去。

用途方面,具体来说,它能做的事可太多了:

  • 身份验证和授权: 这是最常见的,比如
    auth
    中间件,它会检查用户是否登录,或者是否有访问某个资源的权限。
  • 请求日志记录: 记录每次请求的IP、URL、耗时等信息,方便我们分析和排查问题。
  • 数据预处理: 比如,将请求中的某些参数进行格式化、清理,或者解密。
  • 响应处理: 在响应发送给客户端之前,可以对其进行压缩、添加HTTP头,或者统一数据格式。
  • CSRF保护: Laravel自带的
    VerifyCsrfToken
    中间件就是用来防止跨站请求伪造攻击的。
  • 维护模式:
    CheckForMaintenanceMode
    中间件可以在你的应用处于维护状态时,阻止所有请求。

创建和注册中间件的流程: 创建中间件其实非常直观。你可以通过Artisan命令快速生成一个:

php artisan make:middleware EnsureUserIsAdmin

这会在

app/Http/Middleware
目录下生成一个PHP文件,比如
EnsureUserIsAdmin.php
。文件内容大概长这样:

user()?->isAdmin()) {
            abort(403, 'Unauthorized action.');
        }

        return $next($request);
    }
}

handle
方法是核心。它接收两个参数:
$request
(当前的HTTP请求)和
$next
(一个闭包,代表管道中的下一个中间件或最终的控制器动作)。 在这个方法里,你可以执行你的逻辑。如果条件不满足,你可以直接返回一个响应(比如
abort(403)
),请求就不会再往下走了。如果一切正常,你就调用
return $next($request);
,把请求传递给管道中的下一个环节。

注册方面,主要有几种方式:

  1. 全局中间件: 注册在
    app/Http/Kernel.php
    $middleware
    数组里。这些中间件会应用于每一个进入你应用的HTTP请求。适合做一些全局性的操作,比如CSRF保护、维护模式检查等。
    protected $middleware = [
        // \App\Http\Middleware\TrustProxies::class,
        // \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];
  2. 路由中间件: 注册在
    app/Http/Kernel.php
    $middlewareAliases
    数组里。这里你会给你的中间件一个简短的键名(别名),然后在路由定义时使用。
    protected $middlewareAliases = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.session' => \Illuminate\Session\Middleware


# php  # laravel  # app  # session  # ai  # 路由  # laravel中间件  # 中间件  # csrf  # 闭包  # http  # 你可以  # 都要  # 身份验证  # 道中  # 这是  # 组里  # 是在  # 给你  # 在这个  # 走了 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  网站制作价目表怎么做,珍爱网婚介费用多少?  网站建设要注意的标准 促进网站用户好感度!  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  Python文本处理实践_日志清洗解析【指导】  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  如何在IIS7中新建站点?详细步骤解析  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  如何快速搭建高效WAP手机网站吸引移动用户?  如何在Windows环境下新建FTP站点并设置权限?  如何有效防御Web建站篡改攻击?  黑客如何通过漏洞一步步攻陷网站服务器?  如何用AI帮你把自己的生活经历写成一个有趣的故事?  Laravel如何处理异常和错误?(Handler示例)  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  Python进程池调度策略_任务分发说明【指导】  微信h5制作网站有哪些,免费微信H5页面制作工具?  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  Laravel如何使用Vite进行前端资源打包?(配置示例)  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  如何快速生成凡客建站的专业级图册?  微信公众帐号开发教程之图文消息全攻略  Windows Hello人脸识别突然无法使用  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  香港服务器建站指南:免备案优势与SEO优化技巧全解析  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  JavaScript如何操作视频_媒体API怎么控制播放  使用C语言编写圣诞表白程序  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  Swift中switch语句区间和元组模式匹配  如何快速搭建FTP站点实现文件共享?  如何批量查询域名的建站时间记录?  高端建站如何打造兼具美学与转化的品牌官网?  使用spring连接及操作mongodb3.0实例  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  Laravel如何使用模型观察者?(Observer代码示例)  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  iOS发送验证码倒计时应用  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  Laravel怎么在Controller之外的地方验证数据  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)