目录
使用中间件首先得创建中间件,可以通过cmd找到对应tp6项目路径,输入以下composer命令自动创建中间件目录及文件
php think make:middleware Check
创建好后如图:
也可以手动创建middleware目录和对应文件:
- -meta"><?php
- declare (strict_types = 1);
-
- namespace app\middleware;
-
- use think\Response;
-
- -class">class Check
- {
- /**
- * 处理请求
- *
- * -doctag">@param \think\Request $request
- * -doctag">@param \Closure $next
- * -doctag">@return Response
- */
- public function handle(-variable">$request, \Closure -variable">$next)
- {
- //
-
- }
- }
中间件使用需先声明,声明方法如下:
1、找到route/middleware.php写入对应声明,如下
- -meta"><?php
- // 全局中间件定义文件
- return [
- // 全局请求缓存
- // \think\middleware\CheckRequestCache::class,
- // 多语言加载
- // \think\middleware\LoadLangPack::class,
- // Session初始化
- // \think\middleware\SessionInit::class
- \app\middleware\Check2::-variable language_">class,//方法一,直接引入声明
- 'check',//方法二,别名引入法
- ];
2、使用方法二别名引入时,需要先到config/middleware.php里配置别名,配置方法如下:
- -meta"><?php
- // 中间件配置
- return [
- // 别名或分组
- 'alias' => [
- 'check'=>\app\middleware\Check::-variable language_">class,
- 'check2'=>\app\middleware\Check2::-variable language_">class,
- ],
- // 优先级设置,此数组中的中间件会按照数组中的顺序优先执行
- 'priority' => [],
- ];
这样第一步里就可以直接使用别名进行声明了。
3、还有一种比较常用的中间件使用方法,就是不通过1、2声明,而使用路由中间件
- 路由中间件声明方法如下:
- 找到对应的路由文件,如route/app.php书写如下:
- -meta"><?php
- // +----------------------------------------------------------------------
- // | ThinkPHP [ WE CAN DO IT JUST THINK ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
- // +----------------------------------------------------------------------
- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
- // +----------------------------------------------------------------------
- // | Author: liu21st <liu21st@gmail.com>
- // +----------------------------------------------------------------------
- use think\facade\Route;
-
- Route::rule('hhh','test/index')->middleware(\app\middleware\Check2::-variable language_">class);
-
这样访问路径时便可以通过该中间件进行限制。
前置和后置中间件都是很常用的:
前置中间件的通常写法:
- -meta"><?php
-
- namespace app\middleware;
-
- -class">class Before
- {
- public function handle(-variable">$request, \Closure -variable">$next)
- {
- // 添加中间件执行代码
-
- return -variable">$next(-variable">$request);
- }
- }
后置中间件的通常写法:
- -meta"><?php
-
- namespace app\middleware;
-
- -class">class After
- {
- public function handle(-variable">$request, \Closure -variable">$next)
- {
- -variable">$response = -variable">$next(-variable">$request);
-
- // 添加中间件执行代码
-
- return -variable">$response;
- }
- }
也可以写在一起:
- public function handle1(-variable">$request,\Closure -variable">$next){
- //处理HTTP请求,中间键代码
- if(-variable">$request->param('name')==='index'){
- return redirect('../');//返回首页
- }
- //以上部分为前置中间件
- echo "前置中间件<br>";
-
- //获取响应,获取响应之前的代码为前置中间件,
- -variable">$response=-variable">$next(-variable">$request);
- //获取响应之后的为后置中间件的执行内容
-
- //以后部分为后置中间件
- echo "后置中间件<br>";
- //这里回调本身返回response对象
- return -variable">$response;
- }
可以看到前置和后置中间件的执行区别就在于是否在获取$next($request)前或后。
通过还有个收尾工作可以附加,就是在中间件中写入end方法如下:
- public function end(Response -variable">$response){
- echo '<br>收尾工作';
- }
执行先后顺序如下:
比较简单的传值如下:
可以通过给请求对象赋值的方式传参给控制器(或者其它地方),例如
- -meta"><?php
-
- namespace app\middleware;
-
- -class">class Hello
- {
- public function handle(-variable">$request, \Closure -variable">$next)
- {
- -variable">$request->hello = 'ThinkPHP';
-
- return -variable">$next(-variable">$request);
- }
- }
然后在控制器的方法里面可以直接使用
- public function index(Request -variable">$request)
- {
- return -variable">$request->hello; // ThinkPHP
- }
全局中间件>局部中间件>路由中间件>页面组件
中间件的内部执行顺序为:前置>页面操作>后置>return操作>end收尾
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
添加我为好友,拉您入交流群!
请使用微信扫一扫!