运行环境:
win7,phpstudy8.1.0.1,其中,Apache2.4.39,php7.4.1。
通过composer工具,下载了tp6.0.2版本的核心文件,并依次安装了自动多应用部署、中间件。单入口文件是下载核心文件时带的,没有修改。之后部署了两个应用:admin和index。主要目录结构如下。
目录结构:
www WWW目录
└─tp602 WEB部署目录
├─app [应用目录]
│ ├─admin 应用目录
│ │ ├─common.php 函数文件
│ │ ├─controller 控制器目录
│ │ │ └─Index.php 控制器文件
│ │ └─ ... 更多类库目录
│ │
│ ├─index [应用目录]
│ │ ├─common.php 函数文件
│ │ ├─controller 控制器目录
│ │ │ └─Index.php [控制器文件]
│ │ ├─model 模型目录
│ │ ├─view 视图目录
│ │ ├─config 配置目录
│ │ ├─route 路由目录
│ │ │ └─route_i.php [应用路由文件]
│ │ ├─middleware.php [应用中间件注册文件]
│ │ └─ ... 更多类库目录
│ │
│ ├─middleware [中间件目录]
│ │ └─Check.php [中间件文件]
│ ├─middleware.php [全局中间件注册文件]
│ └─...
│
├─config 全局配置目录
│ ├─app.php 应用配置
│ ├─cache.php 缓存配置
│ ├─...
│ ├─middleware.php 中间件配置
│ └─view.php 视图配置
│
├─public WEB目录(对外访问目录)
│ ├─index.php 单入口文件
│ ├─router.php 快速测试文件
│ └─.htaccess 用于apache的重写
│
├─extend 扩展类库目录
├─runtime 应用的运行时目录(可写,可定制)
├─vendor Composer类库目录
│ └─topthink
│ ├─fr
│ ├─think-helper
│ ├─think-multi-app 自动多应用
│ └─...
├─.env 环境变量文件
├─...
相关代码
1. app\index\controller\Index.php/文件代码如下:
<?php
namespace app\index\controller;
use app\BaseController;
class Index extends BaseController
{
// protected $middleware = [\app\middleware\Check::class];
public function index()
{
echo "<br>index/index/index";
}
}2. app\middleware\Check.php文件代码如下:<?php
declare (strict_types = 1);
namespace app\middleware;
class Check
{
public function handle($request, \Closure $next)
{
var_dump($request->param());
return $next($request);
}
}测试过程1. 全局中间件测试(没有定义路由)
在app\middleware.php中的代码如下:
<?php
// 全局中间件定义文件
return [
\app\middleware\Check::class
];用pathinfo方式访问,结果如下图:
用兼容方式访问,结果如下图:

注意上面两个图片的地址栏中,参数表示方式的差别和浏览器输出的不同!
2. 应用中间件测试(没有定义路由)
删除app\middleware.php,在app\index\middleware.php中添加的代码如下:
<?php
// 应用中间件定义文件
return [
\app\middleware\Check::class
];用pathinfo方式访问,结果如下图:
用兼容方式访问,结果如下图:

注意上面两个图片的地址栏中,参数表示方式的差别和浏览器输出的不同!
3. 控制器中间件测试(没有定义路由)
删除app\middleware.php和app\index\middleware.php,在app\index\controller\Index.php中的代码如下:
<?php
namespace app\index\controller;
use app\BaseController;
class Index extends BaseController
{
//定义控制器中间件
protected $middleware = [\app\middleware\Check::class];
public function index()
{
echo "<br>index/index/index";
}
}用pathinfo方式访问,结果如下图:
用兼容方式访问,结果如下图:

注意上面两个图片的地址栏中,参数表示方式,浏览器输出均相同!
4. 路由中间件
在app\index\route\route_i.php文件中定义路由中间件,代码如下:
<?php
use think\facade\Route;
Route::get('hello/[:test]', 'index/hello')
->middleware(\app\middleware\Check::class);测试结果与3中的结果相同。总结:全局中间件、应用中间件好像有问题!
控制器中间件、路由中间件,是我们期望的结果!
最佳答案