标签搜索

ThinkPHP 8 中间件详解

皮卡云
2025-06-21 / 0 评论 / 1 阅读 / 正在检测是否收录...

ThinkPHP 8 的中间件机制提供了一种强大的方式来过滤进入应用的 HTTP 请求,允许你在请求到达控制器之前或响应发送到客户端之后执行特定的逻辑。

中间件基本概念
中间件是一种在请求处理管道中执行的机制,可以:

在请求到达控制器前进行预处理
在响应发送到客户端前进行后处理
终止请求并直接返回响应

创建中间件

可以通过命令行生成中间件:

php think make:middleware CheckAuth

这会生成 app/middleware/CheckAuth.php 文件:

<?php
declare (strict_types = 1);

namespace app\middleware;

class CheckAuth
{
    public function handle($request, \Closure $next)
    {
        // 前置中间件逻辑
        
        $response = $next($request); // 调用下一个中间件/控制器
        
        // 后置中间件逻辑
        
        return $response;
    }
}

中间件注册

全局中间件
在 app/middleware.php 文件中注册:

return [
    \app\middleware\CheckAuth::class,
    // 其他全局中间件...
];

路由中间件
在路由定义中使用:

Route::rule('user/profile', 'user/profile')
    ->middleware(\app\middleware\AuthCheck::class);

控制器中间件
在控制器中定义:

protected $middleware = [
    \app\middleware\AuthCheck::class => ['except' => ['login']],
    \app\middleware\LogOperation::class => ['only' => ['update', 'delete']],
];

中间件

<?php
declare( strict_types = 1 );

namespace app\middleware;

use think\facade\Db;
use think\Response;
use think\facade\Request;

class CheckAuth
 {
    /**
    * 处理请求
    *
    * @param \think\Request $request
    * @param \Closure $next
    * @return Response
    */

    public function handle( $request, \Closure $next ): Response
 {
        // 获取所有输入数据
        $UID = $request->param( 'UID' );

        if ( !$UID ) {
            return Response::create( [
                'code' => 500,
                'msg' => '请传入用户ID!'
            ], 'json' );

        }

        $user = Db::table( 'user' )->where( 'id', $UID )->findOrEmpty();

        if ( empty( $user ) ) {
            return Response::create( [
                'code' => 101,
                'msg' => '用户不存在'
            ], 'json' );

        }

        // 将用户数据附加到请求对象中,供后续控制器使用
        $request->user = $user;

        // 继续处理请求
        return $next( $request );
    }
}

使用控制器

<?php
//APP 调用接口
namespace app\controller;
use think\facade\Db;
use app\BaseController;
use app\middleware\CheckAuth;

class App extends BaseController
 {
    //控制器引用  不验证登录模块 Login
    protected $middleware = [
        CheckAuth::class => [ 'except' => [ 'Login' ] ]
    ];
    //获取控制器的用户信息
    //$user = request()->user;

    public function Login()
 {
        $result = [ 'id'=>1 ];
        return json( [ 'code' => !empty( $result ) ? 0 : 1, 'msg' => !empty( $result ) ? '登录成功' : '登录失败', 'data'=>$result ] );
    }
}
0

评论

博主关闭了所有页面的评论