在ThinkPHP框架中,中间件(Middleware)是一种用于处理请求和响应的机制,允许你在请求到达控制器之前或响应发送到客户端之前执行特定的逻辑。中间件可以用于实现日志记录、权限验证、跨站请求伪造(CSRF)保护等功能。以下是创建和使用中间件的基本步骤:
创建中间件
-
创建中间件类:
- 在
app/http/middleware
目录下创建一个新的PHP类文件。例如,创建一个名为CheckToken.php
的中间件。
- 在
-
编写中间件逻辑:
- 中间件类需要实现
think\middleware\Middleware
接口,或者继承think\Middleware
基类。通常,你只需要定义一个handle
方法。
- 中间件类需要实现
<?php
namespace app\http\middleware;
use think\Response;
use think\Request;
use think\middleware\Middleware;
class CheckToken implements Middleware
{
public function handle(Request $request, \Closure $next)
{
// 在这里检查请求中的Token
$token = $request->header('Authorization');
if (!$token || $token !== 'valid-token') {
return Response::create('Unauthorized', 'html', 401);
}
// 如果验证通过,继续处理请求
return $next($request);
}
}
注册中间件
- 全局中间件:
- 可以在
config/middleware.php
文件中注册全局中间件。全局中间件会对所有请求生效。
- 可以在
return [
\app\http\middleware\CheckToken::class,
];
- 路由中间件:
- 可以在路由定义中为特定路由注册中间件。这种方式更为灵活,允许为不同的路由应用不同的中间件。
use think\facade\Route;
Route::get('user/profile', 'UserController@profile')
->middleware(\app\http\middleware\CheckToken::class);
- 控制器中间件:
- 也可以在控制器中定义中间件,这样中间件只会对该控制器的所有方法或特定方法生效。
namespace app\controller;
use think\facade\Middleware;
class UserController
{
protected $middleware = [\app\http\middleware\CheckToken::class];
public function profile()
{
// 处理用户资料逻辑
}
}
或者为特定方法使用:
public function __construct()
{
Middleware::add(\app\http\middleware\CheckToken::class, 'profile');
}
使用场景
- 权限验证:在访问需要权限的资源时,验证用户是否具备访问权限。
- 日志记录:记录请求的详细信息,用于分析和监控。
- 跨站请求伪造保护:验证请求的来源是否合法。
- 请求限流:限制用户在一定时间内可以发送的请求次数。
注意事项
- 中间件的执行顺序是按照注册的顺序执行的。
- 如果某个中间件返回了响应,后续的中间件将不会被执行。
- 中间件应该尽量保持轻量,避免在其中执行耗时的操作。
通过合理地使用中间件,你可以提高应用程序的模块化程度,并增强代码的可维护性和可扩展性。