이 기사에서는 프리 미들웨어, 포스트 미들웨어, 라우팅 미들웨어, 글로벌 미들웨어 등 미들웨어의 사용법을 주로 소개하는 thinkphp에 대한 관련 지식을 제공합니다. 아래에서 관련 내용을 살펴보시기 바랍니다. 모두에게 도움이 될 것입니다.
추천 학습: "PHP Video Tutorial"
미들웨어는 주로 애플리케이션의 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); }로그인 후 복사
前置中间件的意思就是,在http请求完成之前,先执行中间件的代码。
<?php namespace app\http\middleware; class Before { public function handle($request, \Closure $next) { // 先执行中间件代码 return $next($request); } }
后置中间件的意思就是,在http请求完成之后,才开始执行中间件的代码。
<?php namespace app\http\middleware; class After { public function handle($request, \Closure $next) { $response = $next($request); //后执行中间件代码 return $response; } }
顾名思义,就是指定在某个路由下才会去调用这个中间件,即用户访问了这个路由链接,就会执行这个中间件。
//用户登录的路由 Route::rule('login','index/User/login')->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');
意思就是说,所有的(全局)http访问请求,都会自动调用这个中间件。
在application目录下创建middleware.php文件,代码如下:
<?php return [ //第1个中间件 \app\http\middleware\Auth::class, //第2个中间件(Check中间件没有指定命名空间,所以会默认使用app\http\middleware作为命名空间) 'Check', ];
Thinkphp5.1.8+
版本以上支持模块中间件定义,你可以直接在模块目录下面增加middleware.php
文件,定义方式和全局中间件定义一样,只是只会在该模块下面生效。
Thinkphp5.1.17+
版本以上支持为控制器定义中间件。首先你的控制器需要继承系统的thinkController
类,然后在控制器中定义middleware
属性,例如:
<?php namespace app\index\controller; use think\Controller; class Index extends Controller{ protected $middleware = ['Auth']; public function index() { return 'index'; } }
在某些简单的场合,我们不需要使用中间件类,这时候可以使用闭包定义中间件,但闭包函数必须返回Response
행동 후크와 미들웨어의 차이점:🎜 2. 미들웨어 정의 🎜🎜🎜먼저 cmd 명령줄 명령을 통해 빠르게 미들웨어를 생성할 수 있습니다. 프로젝트의 루트 디렉터리에서 다음 cmd 명령을 실행합니다. 🎜미들웨어: 사용자가 프로젝트 요청을 처리하면 미들웨어는 사용자에게 이 요청에 대한 권한이 있는지 또는 사용자에게 불법적인 액세스 권한이 있는지 여부를 판단할 수 있습니다.
동작 후크 span>: 성공적인 사용자 등록 기록과 같은 작업이 시작되거나 종료될 때 트리거되는 메서드입니다.미들웨어는 사용자 요청을 처리하고, 후크는 사용자 작업을 처리합니다. 미들웨어는 필터와 동일하며, 후크는 이벤트와 동일합니다. , 둘 다 AOP 아이디어를 채택합니다.
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); });
application/ <code>Check
미들웨어는 http/middleware 디렉터리에 생성됩니다. 코드는 다음과 같습니다: 🎜<?php return [ [\app\http\middleware\Auth::class, '张三'], 'Check:李四', ];
🎜 미들웨어 설명: 🎜🎜1 미들웨어의 항목 실행 방법은handle
메서드여야 하며 첫 번째 매개변수는Request
객체이고 두 번째 매개변수는 🎜🎜 2. 미들웨어handle
메서드의 반환 값은Response
개체여야 합니다. 🎜🎜3 요청 개체는 미들웨어에서 직접 사용할 수 있습니다. 🎜🎜4 특정 요구 사항에서는 세 번째 매개변수를 사용하여 추가 매개변수를 전달할 수 있습니다. 🎜Route::rule('login','index/User/login')->middleware('Auth:张三');로그인 후 복사로그인 후 복사1. 사전 미들웨어
🎜사전 미들웨어는 http 요청 이전을 의미합니다. 완료되면 미들웨어 코드를 실행합니다. 🎜Route::rule('login','index/User/login')->middleware(Auth::class, '张三');로그인 후 복사로그인 후 복사2. 포스트 미들웨어
🎜포스트 미들웨어는 http 요청이 완료된 후 미들웨어 코드가 실행되기 시작한다는 의미입니다. 🎜🎜🎜 3. 등록 미들웨어 🎜🎜Route::rule('login','index/User/login')->middleware([Auth::class, 'Check'], '张三');로그인 후 복사로그인 후 복사🎜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); } }로그인 후 복사로그인 후 복사🎜 참고: 그렇지 않은 경우 미들웨어 등록을 위해 전체 클래스 이름을 사용하는 것이 좋습니다. 지정된 네임스페이스는 기본적으로🎜동일한 경로는 여러 미들웨어 등록도 지원합니다. middleware()에서 쉼표로 구분하면 됩니다:🎜apphttpmiddleware
를 네임스페이스로 사용합니다🎜🎜Thinkphp5 버전 .1.8 이후 +, 라우팅 그룹에 대한 미들웨어 등록은 다음과 같이 지원됩니다: 🎜rrreeepublic function index(Request $request) { return $request->result; }로그인 후 복사로그인 후 복사2. 글로벌 미들웨어
🎜즉, 모든 (글로벌) http 액세스 요청이 자동으로 이 미들웨어를 호출한다는 의미입니다. 🎜🎜응용 프로그램 디렉터리에 middleware.php 파일을 생성하세요. 코드는 다음과 같습니다: 🎜rrreee3. 모듈 미들웨어
🎜Thinkphp5.1.8+
버전 이상 모듈 미들웨어 정의를 지원합니다. 모듈 디렉토리 아래에middleware.php
파일을 직접 추가할 수 있습니다. 정의 방법은 와 동일합니다. 전역 미들웨어 정의이지만 이 모듈에서만 적용됩니다. 🎜4. 컨트롤러 미들웨어
🎜Thinkphp5.1.17+
이상에서는 컨트롤러용 미들웨어 정의를 지원합니다. 먼저 컨트롤러는 시스템의thinkController
클래스를 상속한 다음 컨트롤러에서middleware
속성을 정의해야 합니다. 예: 🎜rrreee5. 클로저를 사용하여 미들웨어 정의
🎜몇 가지 간단한 상황에서는 미들웨어 클래스를 사용할 필요가 없습니다. 이 경우 클로저를 사용하여 미들웨어를 정의할 수 있지만 클로저 함수는Response
객체 인스턴스를 반환해야 합니다. 🎜rrreee🎜🎜 4. 미들웨어에 매개변수 전달 🎜🎜🎜🎜 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); } }로그인 후 복사로그인 후 복사需要特别注意:传递的变量名称不要和Request已有的参数变量名有冲突,比如用户登录请求的Request参数里已经有一个username,那么中间件向控制器传参,就不能再用这个username了,否则会改变原来参数的值。
然后在控制器的方法里面可以直接使用:
public function index(Request $request) { return $request->result; }로그인 후 복사로그인 후 복사推荐学习:《PHP视频教程》
위 내용은 Thinkphp5.1은 미들웨어 사용법을 자세히 설명합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!