首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
中间件-定义中间件
中间件-注册中间件
中间件-全局中间件
中间件-将中间件分配给路由
中间件-中间件组
中间件-排序中间件
中间件-中间件参数
中间件-可终止的中间件
CSRF保护-阻止CSRF请求
CSRF保护-CSRF Tokens & SPAs
CSRF保护-从CSRF保护中排除 URI
CSRF保护-X-CSRF-TOKEN
控制器-编写控制器
控制器-基本控制器
控制器-单动作控制器
控制器-控制器中间件
控制器-资源型控制器
控制器-部分资源路由
控制器-嵌套资源
控制器-命名资源路由
控制器-命名资源路由参数
控制器-限定范围的资源路由
控制器-本地化资源 URIs
控制器-补充资源控制器
控制器-单例资源控制器
控制器-依赖注入和控制器
HTTP请求-与请求交互
HTTP请求-访问请求
HTTP请求-请求路径、主机和方法
HTTP请求-请求头
HTTP请求-请求 IP 地址
HTTP请求-内容协商
HTTP请求-PSR-7 请求
HTTP请求-输入
HTTP请求-检索输入
HTTP请求-判断输入是否存在
HTTP请求-合并其他输入
HTTP请求-旧输入
HTTP请求-Cookies
HTTP请求-输入过滤和规范化
HTTP请求-文件
HTTP请求-检索上传的文件
HTTP请求-存储上传的文件
HTTP请求-配置受信任的代理
HTTP请求-配置可信任的 Host
当前位置:
首页>>
技术小册>>
Laravel(10.x)从入门到精通(三)
小册名称:Laravel(10.x)从入门到精通(三)
### 章节:中间件 - 定义中间件 在Laravel框架中,中间件(Middleware)提供了一种便捷的方式来过滤进入应用程序的HTTP请求以及响应的退出。它们是位于请求处理管道中的一层,可以执行诸如身份验证、日志记录、CORS(跨源资源共享)检查、速率限制等多种任务。通过中间件,我们可以优雅地处理请求和响应,而无需在每个路由或控制器中重复相同的逻辑。本章节将深入探讨如何在Laravel 10.x中定义和使用中间件。 #### 一、中间件的基本概念 在Laravel中,中间件可以视为一个类,该类包含了一个或多个`handle`方法。`handle`方法接收两个参数:`$request`(请求实例)和`$next`(闭包)。`$request`用于访问请求信息,而`$next`则是一个必须被调用的闭包,以将请求传递给管道中的下一个中间件或路由/控制器。 中间件的作用流程可以概括为:当一个请求进入应用时,它首先通过一系列的中间件,这些中间件可以对请求进行加工处理;然后,请求才会到达路由或控制器。同样,当响应准备返回时,它也会通过相同的中间件序列(但方向相反),允许中间件在响应发送给客户端之前对其进行修改。 #### 二、定义中间件 要在Laravel中定义中间件,你需要通过Artisan命令行工具创建一个新的中间件类,或者手动在`app/Http/Middleware`目录下创建一个类。 ##### 2.1 使用Artisan命令创建中间件 打开终端或命令提示符,导航到你的Laravel项目根目录,然后运行以下命令来创建一个新的中间件: ```bash php artisan make:middleware MyMiddleware ``` 这里的`MyMiddleware`是你想要创建的中间件的名字。执行上述命令后,Laravel会在`app/Http/Middleware`目录下创建一个新的中间件类文件,文件名与类名相匹配(首字母大写,其余遵循StudlyCaps命名约定)。 ##### 2.2 手动创建中间件 如果你选择不使用Artisan命令,也可以直接在`app/Http/Middleware`目录下创建一个新的PHP类文件。例如,创建一个名为`AgeMiddleware.php`的文件,并添加以下内容作为示例: ```php <?php namespace App\Http\Middleware; use Closure; class AgeMiddleware { /** * 处理传入的请求。 * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { // 假设我们要检查用户的年龄是否达到某个要求 if ($request->user() && $request->user()->age >= 18) { return $next($request); } // 如果用户年龄不符合要求,重定向到首页 return redirect('home'); } } ``` 在上面的例子中,`AgeMiddleware`中间件检查当前用户(如果存在)的年龄是否至少为18岁。如果条件满足,则通过调用`$next($request)`将请求传递给管道中的下一个中间件或路由/控制器。如果不满足条件,则重定向用户到首页。 #### 三、注册中间件 定义中间件后,你需要将其注册到应用中,以便在请求处理管道中使用。中间件可以在全局、路由组或单个路由级别上注册。 ##### 3.1 全局中间件 要在全局范围内使用中间件,你可以将其添加到`app/Http/Kernel.php`文件中的`$middleware`属性数组中。这样,每个进入应用的HTTP请求都会通过该中间件。 ```php protected $middleware = [ // 其他全局中间件 \App\Http\Middleware\AgeMiddleware::class, ]; ``` **注意**:由于全局中间件会在每个请求上运行,因此应谨慎使用,以避免不必要的性能开销。 ##### 3.2 路由中间件 更常见的做法是将中间件分配给特定的路由或路由组。首先,你需要在`Kernel.php`文件的`$routeMiddleware`属性中注册你的中间件,并给它一个短键名: ```php protected $routeMiddleware = [ // 其他路由中间件 'age' => \App\Http\Middleware\AgeMiddleware::class, ]; ``` 然后,你可以在路由定义中使用这个短键名来分配中间件: ```php Route::get('/protected-page', function () { // 只有满足年龄条件的用户才能访问 })->middleware('age'); // 或者在路由组中应用 Route::middleware(['age'])->group(function () { Route::get('/admin/dashboard', function () { // 仅管理员且年龄符合要求才能访问 }); }); ``` #### 四、中间件参数 Laravel允许你向中间件传递额外的参数。这些参数在定义中间件时通过闭包或类方法接收。这对于需要根据不同情况执行不同逻辑的中间件特别有用。 ##### 4.1 通过闭包传递参数 在注册路由中间件时,可以直接在调用`middleware`方法时传递参数: ```php Route::get('/user/{id}/profile', function ($id) { // })->middleware('role:editor'); ``` 为了处理这种带参数的中间件,你需要在中间件的`handle`方法中稍作修改,以接收这些参数: ```php public function handle($request, Closure $next, $role) { if (! $request->user()->hasRole($role)) { // 权限不足处理 } return $next($request); } ``` 然而,Laravel的路由中间件默认不支持直接传递参数。上述示例主要是为了说明概念,实际实现时你可能需要自定义一个服务提供者来解析这些参数,或者使用其他方法(如查询字符串、路由参数等)间接传递。 ##### 4.2 类方法接收参数 另一种方法是让中间件类包含多个方法,每个方法处理不同的逻辑,然后在路由定义中通过指定方法来间接传递“参数”。 #### 五、总结 在Laravel中,中间件是一个强大的功能,允许你在请求处理管道中插入自定义逻辑。通过定义中间件,你可以轻松地实现身份验证、日志记录、CORS检查等功能,而无需在每个路由或控制器中重复相同的代码。本章节介绍了如何定义中间件、注册中间件以及在中间件中传递参数的基本方法。希望这些内容能帮助你更好地理解和使用Laravel的中间件功能。
下一篇:
中间件-注册中间件
该分类下的相关小册推荐:
Swoole入门教程
Laravel(10.x)从入门到精通(七)
Laravel(10.x)从入门到精通(十二)
ThinkPHP项目开发实战
Laravel(10.x)从入门到精通(十七)
PHP8入门与项目实战(3)
Laravel(10.x)从入门到精通(九)
剑指PHP(从入门到进阶)
PHP合辑4-字符串函数
全栈工程师修炼指南
Laravel(10.x)从入门到精通(十四)
Magento零基础到架构师(安装篇)