多应用模式下【index】和【admin】两个应用
接下来的操作是【全局定义】中间件的方式!!!
首先,在框架根目录中修改【config】目录下的【middleware.php】文件
// 中间件配置
return [
// 别名或分组
'alias' => [
'check' => app\middleware\Check::class, //这里写入别名【check】和带命名空间的【Check】类
],
//
'priority' => [],
];
接下来,在【app】根目录中修改【middleware.php】定义文件内容
<?php
// 全局中间件定义文件
return [
// 全局请求缓存
// \think\middleware\CheckRequestCache::class,
// 多语言加载
// \think\middleware\LoadLangPack::class,
// Session初始化
\think\middleware\SessionInit::class,
'check' ⬅ 要定义的中间件在这里!!!采用了【别名】方式
];
以上就完成了中间件的全局定义配置,
接下来是创建中间件文件【check.php】以及自定义文件【index.php】的过程
在【admin】目录下新建【middleware】目录,
并创建【check.php】文件,
写入内容:
namespace app\middleware;
class check
{
public function handle($request, \Closure $next)
{
$request->name = '我就是个小弟弟'; // 可以自己自定义修改的
return $next($request); // return 的格式是固定的,不要更改!!!
}
}
之后,进入【admin】目录-》【controller】目录下,
创建自定义的【index.php】控制器,内容写入:
namespace app\admin\controller;
use think\Request;
class Index
{
public function index(Request $request)
{
echo $request->name; // 这里打印一下name属性 我就是个小弟弟
}
}
以上就完成了最简单的中间件传参方式。
扩充实例应用:
最后的【index.php】文件,一般情况我们会继承官方手册里说的【ba
namespace app\admin\controller;
use think\Request; ⬅ 把这里删除掉
class Index extends ba
{
public function index(Request $request)
{
echo $this->app->request->name; //直接调用app对象中request实例的name属性
echo $this->request->name; // 直接调用request实例中name属性
}
}
扩展思路:
只需要依赖注入的方式【Request $request】将对象注入到index方法中即可,控制器中间件传参也好,路由器中间件传参也罢,都是通过依赖注入的方式修改Request对象中的属性。如果我们在【admin】应用下的【config -> route.php】路由中定义了规则:
Route::rule('/:name','index');
浏览器中输入地址:
http://localhost/admin/haha
此时根据路由定义,传入了参数name,值为【haha】,
按照常规思维会误认为【haha】就是【$request->name】的值,
其实【$request->param['name'] 】才是【haha】,
而【$request->name】是【request】对象的属性值,
通过dump函数,打印一下:
dump($this->request);
看到pathinfo和param里的【haha】了吗,param属性中是【name=>haha】,
这是URL地址的传参值。
所以说,中间件是可以既修改request的属性值,也可以增加新的属性,这个才是大家有时候会迷惑的地方吧。
最佳答案