thinkphp6框架middleware中间件的定义和使用方法示例
2022-11-24 11:10:29
174
{{single.collect_count}}

中间件

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

定义中间件

php think make:middleware Check

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

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

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

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

<?phpnamespace 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里添加如下代码:

<?phpreturn [app\index\middleware\Check::class,];

访问index控制器中的hello方法

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

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

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

前置/后置中间件

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

前置行为的中间件

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

中间件Check.php代码

<?phpnamespace 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

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

引入中间件

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

控制器的hello方法

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

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

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

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

中间件向控制器传参

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

<?phpnamespace 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文件中、路由或者控制器中定义这些中间件,如果不需要使用的话,取消定义即可。

回帖
全部回帖({{commentCount}})
{{item.user.nickname}} {{item.user.group_title}} {{item.friend_time}}
{{item.content}}
{{item.comment_content_show ? '取消' : '回复'}} 删除
回帖
{{reply.user.nickname}} {{reply.user.group_title}} {{reply.friend_time}}
{{reply.content}}
{{reply.comment_content_show ? '取消' : '回复'}} 删除
回帖
收起
没有更多啦~
{{commentLoading ? '加载中...' : '查看更多评论'}}