버전 5.1.6+부터 미들웨어 지원이 공식적으로 도입되었습니다.
미들웨어는 주로 애플리케이션의 HTTP 요청을 가로채거나 필터링하고 필요한 비즈니스 처리를 수행하는 데 사용됩니다.
미들웨어 정의
명령줄 지침을 통해 빠르게 미들웨어를 생성할 수 있습니다
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') == '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; } }
좀 더 실제적인 예를 들어 현재 브라우저 환경이 위챗인지 알리페이
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을 통해 관련 정보를 얻을 수 있습니다.
Register middleware
routing middleware
의 값 가장 일반적으로 사용되는 미들웨어 등록 방법은 라우팅 미들웨어를 등록
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']);
V5 .1.7+ 버전에서는 애플리케이션 구성 디렉터리의 middleware.php에서 미들웨어를 직접 사전 정의할 수 있습니다(실제로 별칭 식별자 추가). 예:
return [ 'auth'=>app\http\middleware\Auth::class, 'check'=>app\http\middleware\Check::class ];
그런 다음 라우팅에서 직접 미들웨어 별칭 등록을 사용합니다.
Route::rule('hello/:name','hello') ->middleware(['Auth', 'Check']);
시작 V5.1.8+부터는 별칭을 사용하여 미들웨어 그룹을 정의할 수 있습니다. 예:
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');
V5. + 특정 도메인 이름에 대한 등록 미들웨어 지원 시작
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', ];
미들웨어 등록에는 전체 클래스 이름을 사용해야 합니다. 네임스페이스가 지정되지 않은 경우 apphttpmiddleware를 다음과 같이 사용하세요. 네임스페이스.
글로벌 미들웨어의 실행 순서는 정의 순서입니다. 글로벌 미들웨어 정의 시 미들웨어 매개변수를 전달할 수 있으며, 두 가지 방식을 지원합니다.
<?php return [ [\app\http\middleware\Auth::class, 'admin'], 'Check', 'Hello:thinkphp', ];
위 정의는 admin 매개변수가 Auth 미들웨어에 전달되고 thinkphp 매개변수가 Hello 미들웨어에 전달된다는 의미입니다.
모듈 미들웨어
V5.1.8+부터 모듈 미들웨어 정의가 지원됩니다. middleware.php 파일을 모듈 디렉터리에 직접 추가할 수 있습니다. 정의 방법은 애플리케이션 미들웨어 정의와 동일합니다. 이 모듈에서만 사용됩니다.
컨트롤러 미들웨어
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); } }
) 전달된 변수 이름이 param 변수와 충돌해서는 안 됩니다.
그러면 컨트롤러 메서드에서 직접 사용할 수 있습니다
public function index(Request $request) { return $request->hello; // ThinkPHP }
이 기사는 ThinkPHP 프레임워크 기술 기사 칼럼에서 가져온 것입니다:http://www.php.cn/phpkj/thinkphp/
위 내용은 thinkphp 미들웨어는 무엇을 의미하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!