>  기사  >  PHP 프레임워크  >  Thinkphp5.1은 미들웨어 사용법을 자세히 설명합니다.

Thinkphp5.1은 미들웨어 사용법을 자세히 설명합니다.

WBOY
WBOY앞으로
2022-04-24 11:56:104040검색

이 기사에서는 프리 미들웨어, 포스트 미들웨어, 라우팅 미들웨어, 글로벌 미들웨어 등 미들웨어의 사용법을 주로 소개하는 thinkphp에 대한 관련 지식을 제공합니다. 아래에서 관련 내용을 살펴보시기 바랍니다. 모두에게 도움이 될 것입니다.

Thinkphp5.1은 미들웨어 사용법을 자세히 설명합니다.

추천 학습: "PHP Video Tutorial"

1. 미들웨어의 역할

미들웨어는 주로 애플리케이션의 HTTP 요청을 가로채거나 필터링하고 수행하는 데 사용됩니다. 필요한 비즈니스 처리. 예를 들어, 미들웨어를 사용하면 사용자의 요청 정보에 한 문장의 트로이 목마가 포함되어 있는지 확인할 수 있습니다. HTTP请求,并进行必要的业务处理。比如可以使用中间件来检查用户的请求信息里是否包含一句话木马。

行为钩子和中间件的区别:

中间件:它是对项目请求做处理,在用户访问我们的项目时,中间件就可以对于这个请求来判断用户是否有权限,或者判断用户是否存在非法访问;

行为钩子:在某一动作开始或者结束的时候会触发的方法,比如用户注册成功记录日志;

中间件是对用户请求做处理,而钩子则是对用户动作的处理,中间件相当于过滤器,钩子相当于事件,都是采用AOP思想。

二、定义中间件

首先,可以通过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、中间件的入口执行方法必须是handle方法,而且第一个参数是Request对象,第二个参数是一个闭包;

2、中间件handle方法的返回值必须是一个Response对象;

3、中间件里可以直接使用Request对象,获取请求参数;

4、在某些需求下,可以使用第三个参数传入额外的参数;

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

    return $next($request);
}

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(&#39;login&#39;,&#39;index/User/login&#39;)->middleware('Auth');

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

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

 说明:中间件的注册建议使用完整的类名,如果没有指定命名空间则默认使用apphttpmiddleware作为命名空间

同一个路由也支持注册多个中间件,只需要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作为命名空间)
    &#39;Check&#39;,
];

3、模块中间件

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

4、控制器中间件

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

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

class Index extends Controller{

    protected $middleware = [&#39;Auth&#39;];

    public function index()
    {
        return &#39;index&#39;;
    }
}

5、使用闭包定义中间件

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

행동 후크와 미들웨어의 차이점:

미들웨어: 사용자가 프로젝트 요청을 처리하면 미들웨어는 사용자에게 이 요청에 대한 권한이 있는지 또는 사용자에게 불법적인 액세스 권한이 있는지 여부를 판단할 수 있습니다.

동작 후크: 성공적인 사용자 등록 기록과 같은 작업이 시작되거나 종료될 때 트리거되는 메서드입니다.

미들웨어는 사용자 요청을 처리하고, 후크는 사용자 작업을 처리합니다. 미들웨어는 필터와 동일하며, 후크는 이벤트와 동일합니다. , 둘 다 AOP 아이디어를 채택합니다.

🎜 2. 미들웨어 정의 🎜🎜🎜먼저 cmd 명령줄 명령을 통해 빠르게 미들웨어를 생성할 수 있습니다. 프로젝트의 루트 디렉터리에서 다음 cmd 명령을 실행합니다. 🎜
Route::group(&#39;hello&#39;, function(){
	Route::rule(&#39;login&#39;,&#39;index/User/login&#39;);
})->middleware(function($request,\Closure $next){
    if ($request->param('name') == 'index') {
        return redirect('/');//重定向到首页
    }    
	return $next($request);
});
🎜 이 명령은 application/ <code>Check 미들웨어는 http/middleware 디렉터리에 생성됩니다. 코드는 다음과 같습니다: 🎜
<?php
return [
	[\app\http\middleware\Auth::class, &#39;张三&#39;],
    &#39;Check:李四&#39;,
];
🎜 미들웨어 설명: 🎜🎜1 미들웨어의 항목 실행 방법은 handle 메서드여야 하며 첫 번째 매개변수는 Request 객체이고 두 번째 매개변수는 🎜🎜 2. 미들웨어 handle 메서드의 반환 값은 Response 개체여야 합니다. 🎜🎜3 요청 개체는 미들웨어에서 직접 사용할 수 있습니다. 🎜🎜4 특정 요구 사항에서는 세 번째 매개변수를 사용하여 추가 매개변수를 전달할 수 있습니다. 🎜
Route::rule(&#39;login&#39;,&#39;index/User/login&#39;)->middleware('Auth:张三');

1. 사전 미들웨어

🎜사전 미들웨어는 http 요청 이전을 의미합니다. 완료되면 미들웨어 코드를 실행합니다. 🎜
Route::rule('login','index/User/login')->middleware(Auth::class, '张三');

2. 포스트 미들웨어

🎜포스트 미들웨어는 http 요청이 완료된 후 미들웨어 코드가 실행되기 시작한다는 의미입니다. 🎜
Route::rule('login','index/User/login')->middleware([Auth::class, 'Check'], '张三');
🎜🎜 3. 등록 미들웨어 🎜🎜

🎜1. 라우팅 미들웨어🎜

🎜 이름에서 알 수 있듯이 이 미들웨어는 특정 경로에서만 호출됩니다. 즉, 사용자가 이 경로 링크에 액세스하면 이 미들웨어가 실행됩니다. 🎜
Route::rule('login','index/user/login')->middleware(['Auth:张三', 'Check:李四']);
🎜 또는 전체 미들웨어 클래스 이름을 사용하세요: 🎜
<?php
namespace app\http\middleware;

class Auth
{
    public function handle($request, \Closure $next)
    {
        //给控制器传参数
        $request->result = '验证成功';       
        return $next($request);
    }
}
🎜 참고: 그렇지 않은 경우 미들웨어 등록을 위해 전체 클래스 이름을 사용하는 것이 좋습니다. 지정된 네임스페이스는 기본적으로 apphttpmiddleware를 네임스페이스로 사용합니다🎜
🎜동일한 경로는 여러 미들웨어 등록도 지원합니다. middleware()에서 쉼표로 구분하면 됩니다:🎜
public function index(Request $request)
{
	return $request->result;
}
🎜Thinkphp5 버전 .1.8 이후 +, 라우팅 그룹에 대한 미들웨어 등록은 다음과 같이 지원됩니다: 🎜rrreee

2. 글로벌 미들웨어

🎜즉, 모든 (글로벌) http 액세스 요청이 자동으로 이 미들웨어를 호출한다는 의미입니다. 🎜🎜응용 프로그램 디렉터리에 middleware.php 파일을 생성하세요. 코드는 다음과 같습니다: 🎜rrreee

3. 모듈 미들웨어

🎜Thinkphp5.1.8+ 버전 이상 모듈 미들웨어 정의를 지원합니다. 모듈 디렉토리 아래에 middleware.php 파일을 직접 추가할 수 있습니다. 정의 방법은 와 동일합니다. 전역 미들웨어 정의이지만 이 모듈에서만 적용됩니다. 🎜

4. 컨트롤러 미들웨어

🎜Thinkphp5.1.17+ 이상에서는 컨트롤러용 미들웨어 정의를 지원합니다. 먼저 컨트롤러는 시스템의 thinkController 클래스를 상속한 다음 컨트롤러에서 middleware 속성을 ​​정의해야 합니다. 예: 🎜rrreee

5. 클로저를 사용하여 미들웨어 정의

🎜몇 가지 간단한 상황에서는 미들웨어 클래스를 사용할 필요가 없습니다. 이 경우 클로저를 사용하여 미들웨어를 정의할 수 있지만 클로저 함수는 Response 객체 인스턴스를 반환해야 합니다. 🎜rrreee🎜🎜 4. 미들웨어에 매개변수 전달 🎜🎜🎜🎜 1. 전역 미들웨어에 매개변수 전달 🎜🎜
<?php
return [
	[\app\http\middleware\Auth::class, &#39;张三&#39;],
    &#39;Check:李四&#39;,
];

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

2、路由中间件传参数

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

Route::rule(&#39;login&#39;,&#39;index/User/login&#39;)->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);
    }
}

需要特别注意:传递的变量名称不要和Request已有的参数变量名有冲突,比如用户登录请求的Request参数里已经有一个username,那么中间件向控制器传参,就不能再用这个username了,否则会改变原来参数的值。

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

public function index(Request $request)
{
	return $request->result;
}

推荐学习:《PHP视频教程

위 내용은 Thinkphp5.1은 미들웨어 사용법을 자세히 설명합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제