Thinkphp6.0中间件的具体使用

目录
  • 全局中间件
  • 应用中间件
  • 路由中间件
  • 控制器中间件
  • 中间件传参

6.0中间件分为系统中间件和应用中间件,系统中间件为核心框架内置的中间件,应用中间件是在应用里面创建的中间件。

中间件的主要应用场景可以包括对HTTP请求的数据过滤、权限检测、请求拦截等行为,使用中间件能够让控制器的定义更加简单,很多额外的非核心业务流程的处理都可以交给中间件执行。

从中间件的使用范围来看,可以分为全局中间件、应用中间件、控制器中间件和路由中间件。

全局中间件

全局中间件是在app\middleware.php中定义的中间件,默认没有启用任何中间件,但对支持的系统中间件做了注释,你只需要取消注释就可以使用相应的系统中间件,默认内容如下:

return [
    // 全局请求缓存
    // 'think\middleware\CheckRequestCache',
    // 多语言加载
    // 'think\middleware\LoadLangPack',
    // Session初始化
    // 'think\middleware\SessionInit',
    // 页面Trace调试
    // 'think\middleware\TraceDebug',
];

系统的部分功能交给中间件进行统一管理,包括全局请求缓存、多语言的自动检测和加载、Session初始化和页面Trace调试,也就是说,默认安装后的应用是不支持Session的,你必须全局开启Session初始化中间件后Session才能生效。对于API应用来说,本身就不需要Session功能支持。

你可以在全局中间件定义文件中添加你的应用中间件,但尽可能确保系统中间件的优先执行,中间件定义需要使用完整的类名,通过命令行指令可以快速创建一个应用中间件:

php think make:middleware Test

会自动生成一个app\middleware\Test中间件类,内容如下:

<?php

namespace app\middleware;

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

也支持通过指定完整命名空间的方式创建中间件类

php think make:middleware app\middleware\Hello

我们添加一个测试输出

<?php

namespace app\middleware;

class Test
{
    public function handle($request, \Closure $next)
    {
     echo 'Before Middleware<br/>';
     $response = $next($request);
     echo 'After Middleware<br/>';
     return $response;
    }
}

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

然后在全局中间件定义中添加

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

假设我们要访问的控制器方法为

<?php

namespace app\controller;

class Index
{
    public function hello()
    {
     return 'Hello,ThinkPHP!<br/>';
    }
}

访问该操作方法的输出为

Before Middleware
Hello,ThinkPHP!
After Middleware

你可以看出中间件的执行过程,从执行流程上可以分为前置中间件和后置中间件,当然,一个中间件可能同时有前置和后置行为,上面的Test中间件就是如此。 $next($request)之前的代码属于前置中间件范畴,之后的代码则属于后置中间件范畴。

应用中间件

如果是多应用模式的话,应用中间件就是在app\应用名\middleware.php中定义的中间件,只会在该应用下有效,定义格式和全局中间件一致。

路由中间件

路由中间件则表示仅在路由匹配之后才会执行某个中间件,在路由定义中使用middleware方法定义,例如:

Route::get('hello/:name','index/hello')
    ->middleware(\app\middleware\Hello::class);

可以给路由分组定义中间件

Route::group(function(){
 Route::get('hello/:name','index/hello');
 //...
})->middleware(\app\middleware\Hello::class);

如果要执行多个中间件,可以使用

Route::group(function(){
 Route::get('hello/:name','index/hello');
 //...
})->middleware([\app\middleware\Hello::class,\app\middleware\Check::class]);

对于经常要使用的中间件,我们可以定义一个别名,在config\middleware.php配置文件中,设置

return [
 'hello' => \app\middleware\Hello::class,
 'check' => \app\middleware\Check::class,
];

路由定义可以改为:

Route::group(function(){
 Route::get('hello/:name','index/hello');
 //...
})->middleware(['hello','check']);

支持给一组中间件定义别名

return [
 'test' => [\app\middleware\Hello::class,\app\middleware\Check::class],
];

路由定义可以改为

Route::group(function(){
 Route::get('hello/:name','index/hello');
 //...
})->middleware('test');

中间件支持传入一个参数,中间件定义如下

<?php

namespace app\middleware;

class Hello
{
    public function handle($request, \Closure $next, string $name = '')
    {
     echo 'Hello'. $name . '<br/>';
     return $next($request);
    }
}

可以在路由中间件的第二个参数传入name参数

Route::get('hello/:name','index/hello')
    ->middleware('hello', 'middleware');

除了支持参数外,你可以在中间件的handle方法中使用依赖注入。

控制器中间件

控制器中间件仅当访问某个控制器的时候生效

<?php

namespace app\controller;

class Hello
{
 protected $middleware = ['hello','check'];

    public function index()
    {
     return 'Hello,ThinkPHP!<br/>';
    }
}

由于前面已经定义了中间件别名,所以这里直接使用别名定义,否则你必须使用完整的命名空间定义。

默认情况下,控制器中定义的中间件访问控制器的任何操作方法都会执行,有时候并不希望所有的操作都需要执行中间件,有两种方式来定义控制器中间件的执行过滤。

<?php

namespace app\controller;

class Index
{
 protected $middleware = [
  'hello' => ['only'  => ['hello']],
  'check' => ['except'=> ['hello']],
 ];

    public function hello()
    {
     return 'Hello,ThinkPHP!<br/>';
    }

    public function check()
    {
     return 'this action require check!<br/>';
    }
}

hello中间件仅在执行Index控制器的hello操作的时候才会执行,而check中间件除了hello方法外,都会执行,具体效果你可以实际测试下。

中间件传参

中间件和控制器之间传参的方式有很多,一个简单的方法是使用Request来进行传参。

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

到此这篇关于Thinkphp6.0中间件的具体使用的文章就介绍到这了,更多相关Thinkphp6.0中间件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 如何使用Casbin作为ThinkPHP的权限控制中间件

    概述 PHP-Casbin是一个强大的.高效的开源访问控制框架,它支持基于各种访问控制模型的权限管理. Think-Casbin是一个专为 ThinkPHP5.1 定制的 Casbin 的扩展包,使开发者更便捷的在 thinkphp 项目中使用 Casbin. 安装 创建 thinkphp 项目(如果没有): composer create-project topthink/think=5.1.* tp5 在ThinkPHP项目里,安装Think-Casbin扩展: composer requi

  • ThinkPHP6.0前置、后置中间件区别

    目录 1. 创建中间件 2. 注册中间件 3. 前置.后置中间件 4. 前置.后置中间件的区别 5. 后置中间件登录拦截器(不推荐) 6. 前置中间件登录拦截器(推荐使用) 1. 创建中间件 命令行创建中间件类文件示例 // app\middleware\Auth php think make:middleware Auth // app\middleware\admin\Auth php think make:middleware admin/Auth // app\admin\middlew

  • Thinkphp6.0中间件的具体使用

    目录 全局中间件 应用中间件 路由中间件 控制器中间件 中间件传参 6.0中间件分为系统中间件和应用中间件,系统中间件为核心框架内置的中间件,应用中间件是在应用里面创建的中间件. 中间件的主要应用场景可以包括对HTTP请求的数据过滤.权限检测.请求拦截等行为,使用中间件能够让控制器的定义更加简单,很多额外的非核心业务流程的处理都可以交给中间件执行. 从中间件的使用范围来看,可以分为全局中间件.应用中间件.控制器中间件和路由中间件. 全局中间件 全局中间件是在app\middleware.php中

  • 使用composer安装使用thinkphp6.0框架问题【视频教程】

    安装composer -vvv的参数是表示展示安装进度,测试时使用其他参数安装失败,一直卡着不动 curl -vvv https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer 先安装下git,才能clone下github上的代码 apt-get install git 在创建项目之前,要安装php的扩展和unzip命令,没有这几个扩展后面创建项目不成功 apt-get install php7

  • 基于thinkphp6.0的success、error实现方法

    最近把项目升级到tp6.0,一开始比较顺利,安装文档升级,但是升级指导指出: 系统不再提供基础控制器类 think\Controller ,原来的 success . error . redirect 和 result 方法需要自己在基础控制器类里面实现. 这意味着需要自己来实现原来的一系列的函数 我这里参考to5.1的跳转源码,进行改进得到,具体步骤如下: 1.app目录下新建一个tpl文件夹,放入dispatch_jump.tpl文件,这个可以直接到原来的tp5中copy 2.在config

  • ThinkPHP6.0如何利用自定义验证规则规范的实现登陆

    1.写在前面 这学期因为各种课内考试,竞赛活动,项目,(和女朋友约会 )

  • phpstorm远程连接服务器并实时更新发布代码(thinkphp6.0.7)

    想要phpstrom 远程连接上服务器,需要通过以下 步骤操作,具体操作跟随一起看看吧! Step1 打开phpstorm Tools->Deployment->Configuration Step2 开始配置连接参数,我的是阿里云的服务器, 有一个 Test Sftp connection 测试连接的可以先测试下 选择yes 接下来 Step3: Text-to-HTML conversion tool 后面继续连接到你的服务器,并next到最后即可 然后如果想实时更新 这个选项得点下 我用

  • 浅谈ASP.NET Core 2.0 中间件(译)

    问题 如何创建一个最简单的ASP.NET Core中间件? 答案 使用VS创建一个ASP.NET Core 2.0的空项目,注意Startup.cs中的Configure()方法: public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.Run(async (context) => { await context.Response.WriteAsync("Hello World! (Run)

  • ThinkPHP6.0 重写URL去掉Index.php的解决方法

    踩坑! 官网给的解决方案: 解决重写URL,省去index.php问题 可以通过URL重写隐藏应用的入口文件index.php,下面是相关服务器的配置参考: [ Apache ] httpd.conf配置文件中加载了mod_rewrite.so模块 AllowOverride None 将None改为 All 把下面的内容保存为.htaccess文件放到应用入口文件的同级目录下 <IfModule mod_rewrite.c> Options +FollowSymlinks -Multivie

  • node.js中express中间件body-parser的介绍与用法详解

    前言 Node中的核心模块分两类:一类是自带的核心模块,如http.tcp等,第二类是第三方核心模块,express就是与http对应的第三方核心模块,用于处理http请求.express在3.0版本中自带有很多中间件,但是在express 4.0以后,就将除static(静态文件处理)以外的其他中间件分离出来了:在4.0以后需要使用中间件时,就需要单独安装好相应的中间件以后调用,以下3.0与4.0中间件的中间件区别(3.0是内置中间件属性名,4.0是需要安装的中间件名称): Express 3

  • 详解KOA2如何手写中间件(装饰器模式)

    前言 Koa 2.x 版本是当下最流行的 NodeJS 框架, Koa 2.0 的源码特别精简,不像 Express 封装的功能那么多,所以大部分的功能都是由 Koa 开发团队(同 Express 是一家出品)和社区贡献者针对 Koa 对 NodeJS 的封装特性实现的中间件来提供的,用法非常简单,就是引入中间件,并调用 Koa 的 use 方法使用在对应的位置,这样就可以通过在内部操作 ctx 实现一些功能,我们接下来就讨论常用中间件的实现原理以及我们应该如何开发一个 Koa 中间件供自己和别

随机推荐