thinkphp6 入门(6)--中间件是什么 怎么用

一、什么是中间件?

当客户端发送请求至服务器时,HTTP请求会经过多个中间件,最后返回响应给客户端。中间件可以

  • 在请求到达目标控制器或动作之前对请求进行操作

  • 可以在响应离开目标控制器或动作之前对响应进行操作

二、中间件的作用

我们可以在不修改应用程序逻辑的情况下添加额外的功能,如

  • 登录验证、

  • 检查用户权限、权限控制

  • 请求过滤

  • 判断当前浏览器环境是在微信或支付宝

  • 写系统日志

  • 统计

三、中间件的类型

1、前置中间件

前置中间件的意思就是,在http请求完成之前,先执行中间件的代码。

一般用来检查用户权限

在app/middleware中新建中间件,每个中间件一个文件

图片

<?php

namespace app\middleware;

// 前置行为的中间件
class AuthMiddleware
{
    public function handle($request, \Closure $next)
{
        // 添加中间件执行代码 start
        echo ' </br>hello </br>';

        // 添加中间件执行代码 end

        return $next($request);
    }
}


2、后置中间件

后置中间件的意思就是,在http请求完成之后,才开始执行中间件的代码。

一般用来写日志、统计

<?php

namespace app\middleware;

// 后置行为的中间件
class LogMiddleware
{
    public function handle($request, \Closure $next)
{
    $response = $next($request);

        // 添加中间件执行代码 start
        echo ' </br>good bye!</br>';

        // 添加中间件执行代码 end

        return $response;
    }
}

中间件说明:

1、中间件的入口执行方法必须是handle方法,而且第一个参数是Request对象,第二个参数是一个闭包;

2、中间件handle方法的返回值必须是一个Response对象;

3、中间件里可以直接使用Request对象,获取请求参数;

四、使用中间件

根据作用范围可以分为4种中间件

全局中间件->应用中间件->路由中间件->控制器中间件

  1. 全局中间件 

全局中间件在app目录下面middleware.php文件中定义

图片

2. 应用中间件 

直接在应用目录下面增加middleware.php文件,定义方式和全局中间件定义一样,只是只会在该应用下面生效。

图片

 
<?php

return [
    app\middleware\AuthMiddleware::class,
];

访问该应用下的任何一个函数,都会先执行了中间件

图片

3. 路由中间件

访问了对应的路由,则会调用对应的中间件,可以调用多个

Route::rule('hello/:name','hello')  ->middleware([\app\middleware\Auth::class, \app\middleware\Check::class]);

4. 控制器中间件

在控制器中定义middleware属性,例如:

图片

上述代码指定了该控制器下的所有函数被调用都会执行对应的控制器

图片

可以通过“except"和‘only’字段为控制器中函数自定义调用的中间件


<?php
namespace app\addons\controller;
use think\Controller;

class Index extends Controller{
    // auth中间件,使用了except,表示出了hello方法外,这个控制器其他的方法都会执行这个中间件
    // check中间件,使用了only表示只有这个控制器的login方法执行这个中间件
    // log中间件,没有使用任何限定参数,表示这个控制器里面所有的方法都会执行log这个中间件
    protected $middleware = [
        'auth' => ['except' => ['hello']],
        'check' => ['only' => 'login'],
        'log'
    ];
    public function index(){
        echo "this is a addons index controller index function";
    }
    public function login(){
        echo "abcd";
    }
    public function hello(){
        echo "abcd";
    }
}

五、向中间件传参

可以使用第三个参数传入额外的参数。

<?php

namespace app\middleware;

class Check
{
    public function handle($request, \Closure $next, $name)
{
        if ($name == 'think') {
            return redirect('index/think');
        }

        return $next($request);
    }
}

下面是给auth中间件传入了一个参数的值'admin'

Route::rule('hello/:name','hello')  ->middleware('auth', 'admin')        ->middleware('hello', 'thinkphp');

六、中间件向控制器传参

<?php

namespace app\middleware;

class Hello
{
    public function handle($request, \Closure $next)
{
        $request->hello = 'ThinkPHP';
        
        return $next($request);
    }
}

在控制器的方法里面可以直接使用

public function index(Request $request){  return $request->hello; // ThinkPHP}

参考:

https://www.php.cn/faq/559015.html

https://www.php.cn/faq/591280.html

https://www.php.cn/faq/562939.html

https://www.kancloud.cn/manual/thinkphp6_0/1037493

https://www.gxlsystem.com/phpkuangjia-2336420.html

软件工程小施同学

20230909

ThinkPHP8 中间件是一种用于处理HTTP请求前后执行的一些任务的机制。它可以增强应用的安全性和功能,例如日志记录、用户认证、缓存控制等。 ### ThinkPHP8 控制器中间件简介 #### 定义 控制器中间件是应用于控制器之前的一组函数,它们能够对控制器的操作提供额外的功能。它允许开发者在所有请求到达特定控制器及其对应的操作前运行一组自定义逻辑。这有助于在执行控制器业务逻辑之前完成一些通用的任务,比如检查用户权限、设置响应头、验证输入数据等。 #### 示例配置 在一个典型的ThinkPHP8项目中,你可以通过以下方式启用控制器中间件: ```php // 配置文件中添加中间件配置 return [ 'middleware' => [ // 具体的中间件列表 'yourMiddlewareClassName' => [ // 中间件处理顺序,默认从上到下依次执行 'before' => ['action', 'view'], // 可选的错误处理函数 'onException' => '\think\ExceptionHandler' ], ], ]; ``` 在这里,`'yourMiddlewareClassName'` 应替换为你实际创建的中间件类名。`'action'` 和 `'view'` 表示分别在控制器方法执行前后执行该中间件。 #### 使用场景举例 1. **日志记录**:可以在每个控制器动作之前加入日志记录中间件,记录用户的访问信息及操作详情。 2. **权限验证**:可以添加一个中间件来检查用户是否拥有访问当前控制器或其操作所需的权限。 3. **跨域资源共享(CORS)控制**:用于处理跨域请求,如设置合适的 `Access-Control-Allow-Origin`, `Access-Control-Allow-Methods` 等 HTTP 标头。 4. **性能监控**:在某些中间件中添加代码来监测每个请求的时间消耗,帮助分析和优化应用性能。 #### 实现步骤 1. 创建中间件类:继承 `\think\middleware\BaseMiddleware` 并实现其方法,如 `handle()` 来放置你需要执行的逻辑。 2. 注册中间件:将创建的中间件类实例注册到应用配置中,并指定其执行顺序。 3. 应用中间件:在需要使用特定中间件的控制器中引用并应用它。 通过合理利用控制器中间件,可以显著提升应用程序的管理和维护效率,同时增加应用的健壮性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

软件工程小施同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值