本篇文章给大家带来了关于thinkphp的相关知识,其中主要介绍了关于中间件的用法,包括了什么是前置中间件、后置中间件,还有路由中间件、全局中间件等等相关内容,下面一起来看一下,希望对大家有帮助。

Thinkphp5.1详细讲解中间件的用法-LMLPHP

推荐学习:《PHP视频教程

一、中间件的作用

中间件主要用于拦截或过滤应用的HTTP请求,并进行必要的业务处理。比如可以使用中间件来检查用户的请求信息里是否包含一句话木马。

二、定义中间件

首先,可以通过cmd命令行指令快速生成中间件,在项目的根目录里执行以下cmd命令:

php think make:middleware Check
登录后复制

这个指令会 application/http/middleware目录下面生成一个Check中间件,代码如下:

<?php

namespace app\http\middleware;

class Check
{
    public function handle($request, \Closure $next)
    {
        if ($request->param('name') == 'index') {
            return redirect('/');//重定向到首页
        }

        return $next($request);//返回的是一个Response对象
    }
}
登录后复制

1、前置中间件

前置中间件的意思就是,在http请求完成之前,先执行中间件的代码。

<?php

namespace app\http\middleware;

class Before
{
    public function handle($request, \Closure $next)
    {
        // 先执行中间件代码
        return $next($request);
    }
}
登录后复制

2、后置中间件

后置中间件的意思就是,在http请求完成之后,才开始执行中间件的代码。

<?php

namespace app\http\middleware;

class After
{
    public function handle($request, \Closure $next)
    {
		$response = $next($request);
        //后执行中间件代码
        return $response;
    }
}
登录后复制

三、注册中间件

1、路由中间件

顾名思义,就是指定在某个路由下才会去调用这个中间件,即用户访问了这个路由链接,就会执行这个中间件。

//用户登录的路由
Route::rule('login','index/User/login')->middleware('Auth');
登录后复制

或者使用完整的中间件类名:

Route::rule('login','index/User/login')->middleware(app\http\middleware\Auth::class);
登录后复制

同一个路由也支持注册多个中间件,只需要middleware()里用逗号隔开即可:

Route::rule('login','index/User/login')->middleware(['Auth', 'Check']);
登录后复制

Thinkphp5.1.8+ 版本后,支持对路由分组注册中间件,如下:

//一个名为user的路由分组
Route::group('user', function(){
	Route::rule('login','index/User/login');
    Route::rule('register','index/User/register');
})->middleware('Auth');
登录后复制

2、全局中间件

意思就是说,所有的(全局)http访问请求,都会自动调用这个中间件。

在application目录下创建middleware.php文件,代码如下:

<?php
return [
    //第1个中间件
	\app\http\middleware\Auth::class,
    //第2个中间件(Check中间件没有指定命名空间,所以会默认使用app\http\middleware作为命名空间)
    'Check',
];
登录后复制

3、模块中间件

Thinkphp5.1.8+版本以上支持模块中间件定义,你可以直接在模块目录下面增加middleware.php文件,定义方式和全局中间件定义一样,只是只会在该模块下面生效。

4、控制器中间件

Thinkphp5.1.17+版本以上支持为控制器定义中间件。首先你的控制器需要继承系统的think\Controller类,然后在控制器中定义middleware属性,例如:

<?php
namespace app\index\controller;
use think\Controller;

class Index extends Controller{

    protected $middleware = ['Auth'];

    public function index()
    {
        return 'index';
    }
}
登录后复制

5、使用闭包定义中间件

在某些简单的场合,我们不需要使用中间件类,这时候可以使用闭包定义中间件,但闭包函数必须返回Response对象实例。

Route::group('hello', function(){
	Route::rule('login','index/User/login');
})->middleware(function($request,\Closure $next){
    if ($request->param('name') == 'index') {
        return redirect('/');//重定向到首页
    }    
	return $next($request);
});
登录后复制

四、给中间件传入参数

1、全局中间件传参数

<?php
return [
	[\app\http\middleware\Auth::class, '张三'],
    'Check:李四',
];
登录后复制

上面的定义表示给Auth中间件传入参数为张三,给Check中间件传入参数为李四

2、路由中间件传参数

(1)、给Auth中间件传入参数张三

Route::rule('login','index/User/login')->middleware('Auth:张三');
登录后复制

也可以这样写:

Route::rule('login','index/User/login')->middleware(Auth::class, '张三');
登录后复制

(2)、给多个中间件传入同一个参数

Route::rule('login','index/User/login')->middleware([Auth::class, 'Check'], '张三');
登录后复制

(3)、单独指定各个中间件的参数

Route::rule('login','index/user/login')->middleware(['Auth:张三', 'Check:李四']);
登录后复制

五、中间件向控制器传参数

前面讲的给中间件传入特定的参数 (常量),那么中间要如何向控制器传入参数呢?我们可以通过给Request请求对象赋值的方式传参给控制器(或者其它地方),例如:

<?php
namespace app\http\middleware;

class Auth
{
    public function handle($request, \Closure $next)
    {
        //给控制器传参数
        $request->result = '验证成功';       
        return $next($request);
    }
}
登录后复制

然后在控制器的方法里面可以直接使用:

public function index(Request $request)
{
	return $request->result;
}
登录后复制

推荐学习:《PHP视频教程

以上就是Thinkphp5.1详细讲解中间件的用法的详细内容,更多请关注Work网其它相关文章!

09-03 20:29