类别:ThinkPHP / 日期:2019-12-17 / 浏览:232 / 评论:0

ThinkPHP6.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
}

浩瀚ThinkPHP教程视频,尽在ki4网,迎接在线进修!

本文转自:https://www.ki4.cn/phpkj/thinkphp/

以上就是一文相识ThinkPHP6.0之中间件的细致内容,更多请关注ki4网别的相干文章!

打赏

感谢您的赞助~

打开支付宝扫一扫,即可进行扫码打赏哦~

版权声明 : 本文未使用任何知识共享协议授权,您可以任何形式自由转载或使用。

 可能感兴趣的文章