🗣 Wd提问: laravel中间件
🤖 Ai回答: 在 Laravel 中,中间件(Middleware) 是一种用于过滤 HTTP 请求的机制。它允许你在请求到达控制器之前或响应发送给客户端之前执行某些逻辑,比如身份验证、权限检查、日志记录、CORS 处理等。
🌟 一、中间件的作用
身份验证:如 `auth` 中间件,确保用户已登录。
权限控制:如 `can:edit-post`,检查用户是否有编辑文章的权限。
日志记录:记录请求信息。
跨域处理:设置 CORS 响应头。
请求预处理:如解析 JSON、清理输入等。
🛠️ 二、创建中间件
使用 Artisan 命令创建中间件:
bash
php artisan make:middleware CheckAge
生成的文件位于 `app/Http/Middleware/CheckAge.php`:
php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class CheckAge
{
public function handle(Request $request, Closure $next)
{
if ($request-age <= 20) {
return redirect('home');
}
return $next($request);
}
}
💡 `handle()` 方法接收两个参数:
`$request`:当前请求对象
`$next`:下一个中间件或控制器方法(必须调用 `$next($request)` 继续流程)
📦 三、注册中间件
1、全局中间件(所有请求都经过)
在 `app/Http/Kernel.php` 的 `$middleware` 数组中添加:
php
protected $middleware = [
\App\Http\Middleware\CheckAge::class,
// ...
];
2、路由中间件(按需绑定到特定路由)
在 `app/Http/Kernel.php` 的 `$routeMiddleware` 数组中注册别名:
php
protected $routeMiddleware = [
'age' = \App\Http\Middleware\CheckAge::class,
// ...
];
然后在路由中使用:
php
Route::get('/profile', function () {
//
})-middleware('age');
或者在控制器构造函数中:
php
public function __construct()
{
$this-middleware('age');
}
🔁 四、中间件参数
你可以在中间件中接收参数:
php
// 在路由中传参
Route::get('/admin', function () {
//
})-middleware('role:admin');
// 中间件 handle 方法
public function handle(Request $request, Closure $next, $role)
{
if (! $request-user()-hasRole($role)) {
abort(403);
}
return $next($request);
}
✅ 支持多个参数:`'role:admin,editor'`
🔄 五、前置 vs 后置中间件
默认中间件是“前置”的 —— 在进入控制器前执行。
你也可以在 `$next($request)` 之后执行后置逻辑:
php
public function handle(Request $request, Closure $next)
{
// 前置逻辑
$response = $next($request);
// 后置逻辑
$response-headers-set('X-Custom-Header', 'Hello');
return $response;
}
🧩 六、中间件组(Middleware Groups)
Laravel 默认提供了一些中间件组,如 `web` 和 `api`:
php
protected $middlewareGroups = [
'web' = [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' = [
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
在路由中使用:
php
Route::middleware(['web'])-group(function () {
//
});
🧪 七、中间件优先级
你可以通过 `$middlewarePriority` 控制中间件执行顺序(通常不需要手动调整):
php
protected $middlewarePriority = [
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\Illuminate\Contracts\Auth\Middleware\AuthenticatesRequests::class,
// ...
];
🚫 八、跳过中间件
有时候你想跳过某个中间件(比如在测试时),可以通过以下方式:
在控制器中排除:
php
public function __construct()
{
$this-middleware('auth')-except(['index']);
}
或者在中间件内部判断:
php
if ($request-path() === 'public-page') {
return $next($request);
}
📚 九、常用内置中间件
| 中间件名称 | 作用 |
| `auth` | 检查用户是否登录 |
| `guest` | 检查用户是否未登录 |
| `throttle` | 限制请求频率 |
| `csrf` | 验证 CSRF Token |
| `verified` | 验证邮箱是否已验证 |
✅ 十、最佳实践建议
1、命名清晰:如 `EnsureUserIsAdmin`
2、职责单一:一个中间件只做一件事
3、避免复杂逻辑:复杂业务逻辑应放在服务层
4、合理使用参数:提高复用性
5、测试中间件:编写单元测试确保功能正确
📝 示例:自定义认证中间件
php
// app/Http/Middleware/EnsureTokenIsValid.php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class EnsureTokenIsValid
{
public function handle(Request $request, Closure $next)
{
if ($request-header('X-API-TOKEN') !== env('API_TOKEN')) {
return response()-json(['error' = 'Invalid token'], 401);
}
return $next($request);
}
}
注册到 `Kernel.php`:
php
'api.token' = \App\Http\Middleware\EnsureTokenIsValid::class,
在路由中使用:
php
Route::middleware('api.token')-get('/data', function () {
return ['message' = 'Success'];
});
📌 总结
Laravel 中间件是一个强大而灵活的工具,用于统一处理请求和响应。掌握中间件可以让你更好地组织代码、提升安全性与可维护性。
✅ 推荐学习路径:
1、创建并注册中间件
2、使用参数和分组
3、实现前后置逻辑
4、结合路由和控制器使用
5、编写测试用例
如果你有具体场景(如 JWT 认证、权限控制、日志记录等),欢迎告诉我,我可以为你定制中间件实现方案!🚀
📣 商家广告:





0
IP地址: 60.51.78.240
搜索次数: 0
提问时间: 2025-11-10 00:50:24
🛒 域名购买:
2.bj.cn
4.bj.cn
gzzc.net
05.gold
373.net.cn
chesou.com.cn
75.gold
touwang.com.cn
naiwang.com.cn
b.qh.cn
❓️ 热门提问:
io 注册域名
云直播云直播
dhcp服务器dns
云电脑多少
ip情绪价值
韩国vps中文
菲律宾 云主机
在哪可以买域名
tt域名
vps免费软件下载
豌豆Ai站群搜索引擎系统
🌐 域名评估:
32.cx
vision2100.cn
n.nx.cn
mbbp.cn
bw.gs
mypettoy.com.cn
yb.gs
su8.bj.cn
cc.qh.cn
ch.gs
⛏ 最新挖掘:
凯里酸汤鱼
贵阳烤脑花
都匀毛尖茶
花溪牛肉粉
贵阳烤生蚝
贵阳烤豆腐
贵阳纸包鱼
贵阳特色菜
🖌 热门作画:
🤝 关于我们:
豌豆Ai
域名
建站
站群
留痕
推广
评估
源码
开发Ai
工具
日记
价格
加盟
广告
流量
留言
联系
🗨 加入群聊:
🔗 友情链接:
站搜
Top U.S. search engines
ai提问
🧰 站长工具:
Ai工具 whois查询 搜索
📢 温馨提示:本站所有问答由Ai自动创作,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
👉 技术支持:本站由豌豆Ai提供技术支持,使用的最新版:《豌豆Ai站群搜索引擎系统 V.25.10.25》搭建本站。