ThinkPHP는 엔터프라이즈 애플리케이션 개발과 민첩한 WEB 애플리케이션 개발을 단순화하기 위해 탄생했습니다. 2006년 초에 처음 탄생했으며 2007년 설날에 공식적으로 ThinkPHP로 이름이 바뀌었고 Apache2 오픈 소스 계약에 따라 출시되었습니다. ThinkPHP는 탄생부터 단순하고 실용적인 디자인 원칙을 고수해 왔으며 뛰어난 성능과 최소한의 코드를 유지하면서도 사용 편의성에도 중점을 두었습니다. 그리고 커뮤니티 팀의 적극적인 참여로 많은 독창적인 기능과 특징을 가지고 있으며 사용 편의성, 확장성 및 성능 측면에서 지속적으로 최적화되고 개선됩니다.
thinkphp 미들웨어란?
버전 5.1.6+부터 미들웨어 지원이 공식적으로 도입되었습니다.
미들웨어는 주로 애플리케이션의 HTTP 요청을 가로채거나 필터링하고 필요한 비즈니스 처리를 수행하는 데 사용됩니다.
미들웨어 정의
명령줄 지침을 통해 미들웨어를 빠르게 생성할 수 있습니다
php think make:middleware Check
이 명령이 적용됩니다/ A http/middleware 디렉터리에 미들웨어가 생성되었는지 확인하세요.
<?php namespace app\http\middleware; class Check { public function handle($request, \Closure $next) { if ($request->param('name') == 'think') { return redirect('index/think'); } return $next($request); } }
미들웨어의 항목 실행 방식은 반드시 핸들 방식이어야 하며, 첫 번째 매개변수는 Request 객체, 두 번째 매개변수는 클로저입니다.
미들웨어 핸들 메서드의 반환 값은 Response 객체여야 합니다.
이 미들웨어에서는 현재 요청의 이름 매개변수가 think와 동일하다고 판단되면 리디렉션 처리를 수행합니다. 그렇지 않으면 요청이 애플리케이션으로 더 전달됩니다. 애플리케이션에 요청을 계속 전달하려면 $request를 인수로 사용하여 콜백 함수 $next를 호출하면 됩니다.
특정 요구 사항에 따라 세 번째 매개변수를 사용하여 추가 매개변수를 전달할 수 있습니다.
<?php namespace app\http\middleware; class Check { public function handle($request, \Closure $next, $name) { if ($name == 'think') { return redirect('index/think'); } return $next($request); } }
사전/사후 미들웨어
특정 작업이 요청되기 전 또는 후에 미들웨어가 실행되는지 여부는 전적으로 미들웨어 정의 자체에 달려 있습니다. .
다음은 사전 동작용 미들웨어
<?php namespace app\http\middleware; class Before { public function handle($request, \Closure $next) { // 添加中间件执行代码 return $next($request); } }
다음은 사후 동작용 미들웨어
<?php namespace app\http\middleware; class After { public function handle($request, \Closure $next) { $response = $next($request); // 添加中间件执行代码 return $response; } }
좀 더 실제적인 예를 들어보겠습니다 , 현재 브라우저 환경이 WeChat인지 Alipay인지 확인해야 합니다.
namespace app\http\middleware; /** * 访问环境检查,是否是微信或支付宝等 */ class InAppCheck { public function handle($request, \Closure $next) { if (preg_match('~micromessenger~i', $request->header('user-agent'))) { $request->InApp = 'WeChat'; } else if (preg_match('~alipay~i', $request->header('user-agent'))) { $request->InApp = 'Alipay'; } return $next($request); } }
그런 다음 middleware.php 파일을 모듈의 모바일 버전에 추가합니다
예: /path / application/mobile/middleware.php
return [ app\http\middleware\InAppCheck::class, ];
그런 다음 컨트롤러에서 $this->request->InApp
을 통해 관련 값을 얻을 수 있습니다. 미들웨어 등록
라우팅 미들웨어
가장 일반적으로 사용되는 미들웨어 등록 방법은 라우팅 미들웨어 등록
Route::rule('hello/:name','hello') ->middleware('Auth');
Route::rule('hello/:name','hello') ->middleware(app\http\middleware\Auth::class);
Route::rule('hello/:name','hello') ->middleware(['Auth', 'Check']);
return [ 'auth'=>app\http\middleware\Auth::class, 'check'=>app\http\middleware\Check::class ];
Route::rule('hello/:name','hello') ->middleware(['auth', 'check']);
return [ 'check'=>[ app\http\middleware\Auth::class, app\http\middleware\Check::class ], ];
Route::rule('hello/:name','hello') ->middleware('check');
Route::group('hello', function(){ Route::rule('hello/:name','hello'); })->middleware('Auth');
Route::domain('admin', function(){ // 注册域名下的路由规则 })->middleware('Auth');
Route::rule('hello/:name','hello') ->middleware('Auth:admin');
사용 상수 정의를 사용하는 경우 두 번째 매개변수에 미들웨어 매개변수를 전달할 수 있습니다.
Route::rule('hello/:name','hello') ->middleware(Auth::class, 'admin');
여러 미들웨어를 정의해야 하는 경우 배열 방법을 사용하세요
Route::rule('hello/:name','hello') ->middleware([Auth::class, 'Check']);
동일한 추가 매개변수를 균일하게 전달할 수 있습니다
Route::rule('hello/:name','hello') ->middleware([Auth::class, 'Check'], 'admin');
또는 지정 미들웨어는 별도로 소프트웨어 매개변수입니다.
Route::rule('hello/:name','hello') ->middleware(['Auth:admin', 'Check:editor']);
어떤 간단한 상황에서는 클로저를 사용할 수 있습니다. 패키지는 미들웨어를 정의하지만 클로저 함수는 응답 객체 인스턴스를 반환해야 합니다.
Route::group('hello', function(){ Route::rule('hello/:name','hello'); })->middleware(function($request,\Closure $next){ if ($request->param('name') == 'think') { return redirect('index/think'); } return $next($request); });
다음 방법을 사용하여 응용 프로그램 디렉터리 아래에 middleware.php 파일을 정의할 수 있습니다.
<?php return [ \app\http\middleware\Auth::class, 'Check', 'Hello', ];
<?php return [ [\app\http\middleware\Auth::class, 'admin'], 'Check', 'Hello:thinkphp', ];
모듈 미들웨어
버전 V5.1.8 이상부터 모듈 미들웨어 정의가 지원됩니다. 모듈 디렉터리 아래에 직접 미들웨어를 추가할 수 있습니다. PHP 파일은 애플리케이션 미들웨어 정의와 동일한 방식으로 정의되지만 이 모듈에서만 적용됩니다.
Controller middleware
V5.1.17+부터는 컨트롤러에 대한 미들웨어 정의가 지원됩니다. 먼저 컨트롤러는 시스템의 thinkController 클래스를 상속한 다음 컨트롤러에 미들웨어 속성을 정의해야 합니다. 예:
<?php namespace app\index\controller; use think\Controller; class Index extends Controller { protected $middleware = ['Auth']; public function index() { return 'index'; } public function hello() { return 'hello'; } }
<?php namespace app\index\controller; use think\Controller; class Index extends Controller { protected $middleware = [ 'Auth' => ['except' => ['hello'] ], 'Hello' => ['only' => ['hello'] ], ]; public function index() { return 'index'; } public function hello() { return 'hello'; } }
미들웨어가 컨트롤러에 매개변수를 전달합니다# 🎜🎜#
요청 객체에 값을 할당하여 컨트롤러(또는 다른 장소)에 매개변수를 전달할 수 있습니다. 예: <?php
namespace app\http\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框架技术文章栏目:http://www.php.cn/phpkj/thinkphp/
위 내용은 thinkphp 미들웨어란 무엇인가의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!