thinkphp6框架middleware中间件的定义和使用方法示例

中间件

中间件主要用于拦截或过滤应用的HTTP请求,并进行必要的业务处理。

定义中间件

php think make:middleware Check

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

中间件的入口执行方法必须是handle方法,而且第一个参数是Request对象,第二个参数是一个闭包。
中间件handle方法的返回值必须是一个Response对象。

当前thinkpghp6的目录结构为多应用模式,所以,将middleware目录和middleware.php 文件拷贝了一份到index应用中

在这里插入图片描述
且修改中间件Check 类命名空间

<?php

namespace app\index\middleware;

class Check
{
    public function handle($request, \Closure $next)
    {

        echo '得到name=' . $request->param('name') . '<br>';

        if ($request->param('name') == 'qipa250') {
            echo '你好我是奇葩250';
        } else {
            echo '你好我不是奇葩250';
        }
        echo '<br>';
        echo '走到app\index\middleware\Check类的handle方法了';
        return $next($request);
    }
}

配置中间件

在app/middleware.php或者app/admin/middleware.php里添加如下代码:

<?php

return [
    app\index\middleware\Check::class,
];

访问index控制器中的hello方法

    public function hello($name = 'ThinkPHP6')
    {
       echo $name;
    }

不传入name的值 打印结果如下
在这里插入图片描述

传入name的值为qipa250 打印结果如下:
在这里插入图片描述
在这里插入图片描述

前置/后置中间件

中间件是在请求具体的操作之前还是之后执行,完全取决于中间件的定义本身

前置行为的中间件

//关键代码
$next($request);

中间件Check.php代码

<?php

namespace app\index\middleware;

class Check
{
    public function handle($request, \Closure $next)
    {

        echo '得到name=' . $request->param('name') . '<br>';

        if ($request->param('name') == 'qipa250') {
            echo '你好我是奇葩250';
        } else {
            echo '你好我不是奇葩250';
        }
        echo '<br>';
        echo '走到app\index\middleware\Check类的handle方法了';
        return $next($request);
    }
}

控制器中hello的方法

    public function hello($name = 'ThinkPHP6')
    {
        echo '<br>我是hello方法的name=' . $name;
    }

我们访问hello方法时,发现,优先执行的是中间件中的内容,最后才打印了hello方法中的内容

在这里插入图片描述

后置行为的中间件

新建中间件After

<?php

namespace app\index\middleware;

class After
{
    public function handle($request, \Closure $next)
    {
    	//定义一个变量HOME_NAME
        define('HOME_NAME', '奇葩天地网');
        $response = $next($request);
        return $response;
    }
}

引入中间件

<?php
return [
   // app\index\middleware\Check::class,
    app\index\middleware\After::class,
];

控制器的hello方法


    public function hello($name = 'ThinkPHP6')
    {
        echo HOME_NAME;
        echo '<br>我是hello方法的name=' . $name;
    }

可以正常打印
在这里插入图片描述
若是修改位置

<?php

namespace app\index\middleware;

class After
{
    public function handle($request, \Closure $next)
    {
        $response = $next($request);
        //放到后置执行
        define('HOME_NAME', '奇葩天地网');
        return $response;
    }
}

则报错,因为他找不到HOME_NAME这个变量
在这里插入图片描述

中间件向控制器传参

可以通过给请求对象赋值的方式传参给控制器(或者其它地方),例如

<?php

namespace app\index\middleware;

class After
{
    public function handle($request, \Closure $next)
    {
        $request->name='奇葩天地网';
        $response = $next($request);
        return $response;
    }
}

控制器中

    public function hello(Request $request,$name = 'ThinkPHP6')
    {
      echo  'name'.$request->name;
      echo '<br>我是hello方法的name=' . $name;
    }

在这里插入图片描述

内置中间件

新版内置了几个系统中间件,包括:
中间件类 描述
think\middleware\AllowCrossDomain 跨域请求支持
think\middleware\CheckRequestCache 请求缓存
think\middleware\LoadLangPack 多语言加载
think\middleware\SessionInit Session初始化
think\middleware\TraceDebug 页面Trace支持

这些内置中间件默认都没有定义,你可以在应用的middleware.php文件中、路由或者控制器中定义这些中间件,如果不需要使用的话,取消定义即可。

ThinkPHP8中创建使用路由中间件的步骤可以分为以下几个部分: 1. 创建中间件: 首先,你需要在应用的中间件目录中创建一个新的中间件类。通常这个目录是 `application\index\middleware`,但具体的路径可能因应用的命名空间而有所不同。你可以通过ThinkPHP提供的命令行工具来创建一个新的中间件: ``` php think make:middleware CheckAuth ``` 执行上述命令后,会在指定目录生成一个名为 `CheckAuth` 的中间件类文件。 2. 定义中间件逻辑: 在生成的中间件类文件中,你需要实现 `handle` 方法,这个方法会在请求到达控制器之前被调用。在这个方法中,你可以定义需要的逻辑,例如权限检查、请求日志记录等: ```php namespace app\index\middleware; use Closure; class CheckAuth { public function handle($request, Closure $next) { // 在这里添加中间件逻辑,例如检查用户是否已登录 if (/* 检查条件 */) { // 如果用户未通过检查,可以重定向到其他页面或返回错误信息 return redirect('login'); } // 如果通过检查,则继续请求处理流程 return $next($request); } } ``` 3. 注册中间件: 创建并实现中间件逻辑之后,你需要在应用的路由配置文件中注册这个中间件。通常是 `route` 目录下的 `route.php` 文件。你可以在该文件中使用中间件: ```php use app\index\middleware\CheckAuth; // 注册全局中间件 $middleware = \app\http\middleware\CheckAuth::class; $route->middleware($middleware); // 或者为特定路由注册中间件 $route->get('admin', 'admin/Index/index')->middleware($middleware); ``` 通过这些步骤,你就可以在ThinkPHP8中创建使用路由中间件了。记得根据你的实际应用结构需求调整上述代码示例中的路径类名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值