미들웨어(MiddleWare)
미들웨어를 빠르게 생성하는 방법은?
명령줄을 통해: app/middleware 디렉토리에 Check 미들웨어를 생성하세요
php think make:middleware Check
미들웨어 코드:
<?php namespace app\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\middleware; class Check { public function handle($request, \Closure $next, $name) { if ($name == 'think') { return redirect('index/think'); } return $next($request); } }
End 스케줄링
미들웨어는 요청이 끝나기 전에 콜백 메커니즘을 정의하는 것을 지원합니다. 미들웨어 클래스에 end 메소드만 추가하면 됩니다.
public function end(\think\Response $response) { // 回调行为 }
end 메소드에서는 응답 출력이 불가능하다는 점에 유의하세요. 콜백이 발행되면 요청 응답 출력이 완료되었기 때문입니다.
사전/사후 미들웨어
특정 작업이 요청되기 전이나 후에 미들웨어가 실행되는지 여부는 전적으로 미들웨어 자체의 정의에 달려 있습니다.
다음은 사전 동작을 위한 미들웨어입니다
<?php namespace app\middleware; class Before { public function handle($request, \Closure $next) { // 添加中间件执行代码 return $next($request); } }
다음은 사후 동작을 위한 미들웨어입니다
<?php namespace app\middleware; class After { public function handle($request, \Closure $next) { $response = $next($request); // 添加中间件执行代码 return $response; } }
미들웨어 메소드는 의존성 주입도 지원할 수 있습니다.
더 실제적인 예를 들어보겠습니다. 현재 브라우저 환경이 WeChat인지 Alipay인지 확인해야 합니다.
namespace app\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/app/mobile/ middleware .php
return [ app\middleware\InAppCheck::class, ];그런 다음 컨트롤러에서 $this->request->InApp
미들웨어 별칭 정의
애플리케이션 구성의 middleware.php에서 직접 사전 설정할 수 있습니다. 디렉토리 미들웨어 정의(실제로 별칭 식별자 추가), 예:return [ 'alias' => [ 'auth' => app\middleware\Auth::class, 'check' => app\middleware\Check::class, ], ];는 별칭을 사용하여 미들웨어 세트를 정의하는 것을 지원할 수 있습니다. 예:
return [ 'alias' => [ 'check' => [ app\middleware\Auth::class, app\middleware\Check::class, ], ], ];
미들웨어 등록
글로벌 미들웨어
글로벌 미들웨어는 앱 디렉토리 아래의 middleware.php 파일에 있습니다. 정의, 다음 방법을 사용하십시오:
<?php return [ \app\middleware\Auth::class, 'check', 'Hello', ];미들웨어 등록에는 완전한 클래스 이름을 사용해야 합니다. 미들웨어 별칭(또는 그룹)이 정의된 경우 직접 사용할 수 있습니다. 글로벌 미들웨어의 실행 순서는 정의 순서입니다. 글로벌 미들웨어 정의 시 미들웨어 매개변수를 전달할 수 있으며, 두 가지 방식을 지원합니다.
<?php return [ [\app\http\middleware\Auth::class, 'admin'], 'Check', ['hello','thinkphp'], ];위 정의는 admin 매개변수가 Auth 미들웨어에 전달되고 thinkphp 매개변수가 Hello 미들웨어에 전달된다는 의미입니다.
애플리케이션 미들웨어
다중 애플리케이션 모드를 사용하는 경우 애플리케이션 미들웨어 정의가 지원됩니다. middleware.php 파일을 애플리케이션 디렉터리 아래에 직접 추가할 수 있습니다. 정의 방법은 전역 미들웨어 정의와 동일하지만 애플리케이션에서만 적용됩니다. .
라우팅 미들웨어
가장 일반적으로 사용되는 미들웨어 등록 방법은 라우팅 미들웨어를 등록하는 것입니다
Route::rule('hello/:name','hello') ->middleware(\app\middleware\Auth::class);
여러 미들웨어 등록을 지원합니다
Route::rule('hello/:name','hello') ->middleware([\app\middleware\Auth::class, \app\middleware\Check::class]);
애플리케이션 구성 디렉터리의 middleware.php에 미들웨어를 직접 미리 정의할 수 있습니다(실제로는 별칭 식별자 추가), 예:
return [ 'auth' => app\middleware\Auth::class, 'check' => app\middleware\Check::class ];
그런 다음 미들웨어 별칭을 직접 사용하여 경로에 등록합니다.
Route::rule('hello/:name','hello') ->middleware(['auth', 'check']);
별칭을 사용하여 미들웨어 집합을 정의할 수 있습니다. 예:
return [ 'check' => [ app\middleware\Auth::class, app\middleware\Check::class ], ];
그런 다음 다음을 사용하여 직접 등록합니다. method 미들웨어
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, 'Check']);
는 동일한 추가 매개변수
Route::rule('hello/:name','hello') ->middleware(['auth', 'check'], 'admin');
를 전달하거나 다른 매개변수
Route::rule('hello/:name','hello') ->middleware('auth', 'admin') ->middleware('hello', 'thinkphp');
를 지정하여 별도로 여러 번 호출할 수 있습니다. 라우팅 미들웨어를 전역적으로 실행하려는 경우(경로가 일치하는지 여부에 관계없이) 아님) 라우팅에서 정의할 필요가 없으며 라우팅 구성 파일에서 직접 정의하는 것이 지원됩니다. 예를 들어 config/route.php 구성 파일에
'middleware' => [ app\middleware\Auth::class, app\middleware\Check::class, ],
를 추가하면 됩니다. 애플리케이션 아래의 요청은 인증 및 확인 미들웨어를 실행합니다.
클로저를 사용하여 미들웨어 정의
미들웨어 클래스를 사용할 필요는 없습니다. 일부 간단한 상황에서는 클로저를 사용하여 미들웨어를 정의할 수 있지만 클로저 함수는 응답 개체 인스턴스를 반환해야 합니다.
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); });
Controller middleware
는 컨트롤러용 미들웨어 정의를 지원합니다. 컨트롤러에서 미들웨어 속성만 정의하면 됩니다. 예:
<?php namespace app\controller; class Index { protected $middleware = ['auth']; public function index() { return 'index'; } public function hello() { return 'hello'; } }
인증 미들웨어는 인덱스 컨트롤러가 실행될 때 호출되며 전체 네임스페이스 정의의 사용도 지원됩니다.
컨트롤러 중간에 효과적인 동작을 설정해야 한다면 다음과 같이 정의하면 됩니다.
<?php namespace app\controller; class Index { protected $middleware = [ 'auth' => ['except' => ['hello'] ], 'check' => ['only' => ['hello'] ], ]; public function index() { return 'index'; } public function hello() { return 'hello'; } }
미들웨어는 컨트롤러에 매개변수를 전달합니다.
컨트롤러(또는 다른 장소)에 매개변수를 전달할 수 있습니다. 요청 개체에 값을 할당하여(예:
<?php namespace app\middleware; class Hello { public function handle($request, \Closure $next) { $request->hello = 'ThinkPHP'; return $next($request); } }
그런 다음 컨트롤러 메서드에서 직접 사용할 수 있음
public function index(Request $request) { return $request->hello; // ThinkPHP }
실행 우선 순위
미들웨어의 실행 순서에 대한 엄격한 요구 사항이 있는 경우 다음을 정의할 수 있습니다.) 미들웨어의 실행 우선순위. 프로필에
return [ 'alias' => [ 'check' => [ app\middleware\Auth::class, app\middleware\Check::class, ], ], 'priority' => [ think\middleware\SessionInit::class, app\middleware\Auth::class, app\middleware\Check::class, ], ];
추가