• 售前

  • 售后

热门帖子
入门百科

Thinkphp6.0中心件的具体使用

[复制链接]
AriesHun 显示全部楼层 发表于 2022-1-9 09:14:53 |阅读模式 打印 上一主题 下一主题
目录


  • 全局中心件
  • 应用中心件
  • 路由中心件
  • 控制器中心件
  • 中心件传参
6.0中心件分为体系中心件和应用中心件,体系中心件为焦点框架内置的中心件,应用中心件是在应用内里创建的中心件。
中心件的主要应用场景可以包括对HTTP请求的数据过滤、权限检测、请求拦截等行为,使用中心件能够让控制器的界说更加简单,许多额外的非焦点业务流程的处置处罚都可以交给中心件执行。
从中心件的使用范围来看,可以分为全局中心件、应用中心件、控制器中心件和路由中心件。

全局中心件


全局中心件是在app\middleware.php中界说的中心件,默认没有启用任何中心件,但对支持的体系中心件做了解释,你只需要取消解释就可以使用相应的体系中心件,默认内容如下:
  1. return [
  2.     // 全局请求缓存
  3.     // 'think\middleware\CheckRequestCache',
  4.     // 多语言加载
  5.     // 'think\middleware\LoadLangPack',
  6.     // Session初始化
  7.     // 'think\middleware\SessionInit',
  8.     // 页面Trace调试
  9.     // 'think\middleware\TraceDebug',
  10. ];
复制代码
体系的部分功能交给中心件进行统一管理,包括全局请求缓存、多语言的主动检测和加载、Session初始化和页面Trace调试,也就是说,默认安装后的应用是不支持Session的,你必须全局开启Session初始化中心件后Session才能收效。对于API应用来说,自己就不需要Session功能支持。
你可以在全局中心件界说文件中添加你的应用中心件,但尽大概确保体系中心件的优先执行,中心件界说需要使用完整的类名,通过命令行指令可以快速创建一个应用中心件:
  1. php think make:middleware Test
复制代码
会主动生成一个app\middleware\Test中心件类,内容如下:
  1. <?php
  2. namespace app\middleware;
  3. class Test
  4. {
  5.     public function handle($request, \Closure $next)
  6.     {
  7.     }
  8. }
复制代码
也支持通过指定完整定名空间的方式创建中心件类
  1. php think make:middleware app\middleware\Hello
复制代码
我们添加一个测试输出
  1. <?php
  2. namespace app\middleware;
  3. class Test
  4. {
  5.     public function handle($request, \Closure $next)
  6.     {
  7.      echo 'Before Middleware<br/>';
  8.      $response = $next($request);
  9.      echo 'After Middleware<br/>';
  10.      return $response;
  11.     }
  12. }
复制代码
中心件handle方法的返回值必须是一个Response对象。
然后在全局中心件界说中添加
  1. return [
  2. \app\middleware\Test::class,
  3. ];
复制代码
假设我们要访问的控制器方法为
  1. <?php
  2. namespace app\controller;
  3. class Index
  4. {
  5.     public function hello()
  6.     {
  7.      return 'Hello,ThinkPHP!<br/>';
  8.     }
  9. }
复制代码
访问该操纵方法的输出为
  1. Before Middleware
  2. Hello,ThinkPHP!
  3. After Middleware
复制代码
你可以看出中心件的执行过程,从执行流程上可以分为前置中心件和后置中心件,固然,一个中心件大概同时有前置和后置行为,上面的Test中心件就是云云。 $next($request)之前的代码属于前置中心件范畴,之后的代码则属于后置中心件范畴。

应用中心件


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

路由中心件


路由中心件则表现仅在路由匹配之后才会执行某个中心件,在路由界说中使用middleware方法界说,例如:
  1. Route::get('hello/:name','index/hello')
  2.     ->middleware(\app\middleware\Hello::class);
复制代码
可以给路由分组界说中心件
  1. Route::group(function(){
  2. Route::get('hello/:name','index/hello');
  3. //...
  4. })->middleware(\app\middleware\Hello::class);
复制代码
如果要执行多个中心件,可以使用
  1. Route::group(function(){
  2. Route::get('hello/:name','index/hello');
  3. //...
  4. })->middleware([\app\middleware\Hello::class,\app\middleware\Check::class]);
复制代码
对于经常要使用的中心件,我们可以界说一个别名,在config\middleware.php设置文件中,设置
  1. return [
  2. 'hello' => \app\middleware\Hello::class,
  3. 'check' => \app\middleware\Check::class,
  4. ];
复制代码
路由界说可以改为:
  1. Route::group(function(){
  2. Route::get('hello/:name','index/hello');
  3. //...
  4. })->middleware(['hello','check']);
复制代码
支持给一组中心件界说别名
  1. return [
  2. 'test' => [\app\middleware\Hello::class,\app\middleware\Check::class],
  3. ];
复制代码
路由界说可以改为
  1. Route::group(function(){
  2. Route::get('hello/:name','index/hello');
  3. //...
  4. })->middleware('test');
复制代码
中心件支持传入一个参数,中心件界说如下
  1. <?php
  2. namespace app\middleware;
  3. class Hello
  4. {
  5.     public function handle($request, \Closure $next, string $name = '')
  6.     {
  7.      echo 'Hello'. $name . '<br/>';
  8.      return $next($request);
  9.     }
  10. }
复制代码
可以在路由中心件的第二个参数传入name参数
  1. Route::get('hello/:name','index/hello')
  2.     ->middleware('hello', 'middleware');
复制代码
除了支持参数外,你可以在中心件的handle方法中使用依赖注入。

控制器中心件


控制器中心件仅当访问某个控制器的时间收效
  1. <?php
  2. namespace app\controller;
  3. class Hello
  4. {
  5. protected $middleware = ['hello','check'];
  6.     public function index()
  7.     {
  8.      return 'Hello,ThinkPHP!<br/>';
  9.     }
  10. }
复制代码
由于前面已经界说了中心件别名,所以这里直接使用别名界说,否则你必须使用完整的定名空间界说。
默认情况下,控制器中界说的中心件访问控制器的任何操纵方法都会执行,有时间并不盼望全部的操纵都需要执行中心件,有两种方式来界说控制器中心件的执行过滤。
  1. <?php
  2. namespace app\controller;
  3. class Index
  4. {
  5. protected $middleware = [
  6.   'hello' => ['only'  => ['hello']],
  7.   'check' => ['except'=> ['hello']],
  8. ];
  9.     public function hello()
  10.     {
  11.      return 'Hello,ThinkPHP!<br/>';
  12.     }
  13.     public function check()
  14.     {
  15.      return 'this action require check!<br/>';
  16.     }   
  17. }
复制代码
hello中心件仅在执行Index控制器的hello操纵的时间才会执行,而check中心件除了hello方法外,都会执行,具体结果你可以现实测试下。

中心件传参


中心件和控制器之间传参的方式有许多,一个简单的方法是使用Request来进行传参。
  1. <?php
  2. namespace app\middleware;
  3. class Hello
  4. {
  5.     public function handle($request, \Closure $next)
  6.     {
  7.         $request->hello = 'ThinkPHP';
  8.         
  9.         return $next($request);
  10.     }
  11. }
复制代码
中心件向控制器传参必须在前置中心件完成,后置中心件向控制器的传参控制器无法吸收。
然后在控制器的方法内里可以直接使用
  1. public function index(Request $request)
  2. {
  3. return $request->hello; // ThinkPHP
  4. }
复制代码
到此这篇关于Thinkphp6.0中心件的具体使用的文章就介绍到这了,更多干系Thinkphp6.0中心件内容请搜索草根技术分享从前的文章或继续欣赏下面的干系文章盼望各人以后多多支持草根技术分享!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作