>  기사  >  PHP 프레임워크  >  thinkphp 미들웨어는 무엇을 의미하나요?

thinkphp 미들웨어는 무엇을 의미하나요?

藏色散人
藏色散人원래의
2019-06-29 13:31:003407검색

thinkphp 미들웨어는 무엇을 의미하나요?

버전 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(&#39;name&#39;) == &#39;think&#39;) {
            return redirect(&#39;index/think&#39;);
        }
        return $next($request);
    }
}

미들웨어의 항목 실행 방식은 반드시 핸들 방식이어야 하며, 첫 번째 매개변수는 Request 객체, 두 번째 매개변수는 클로저입니다.

미들웨어 핸들 메서드의 반환 값은 Response 객체여야 합니다.

이 미들웨어에서는 현재 요청의 이름 매개변수가 think와 동일하다고 판단되면 리디렉션 처리를 수행합니다. 그렇지 않으면 요청이 애플리케이션으로 더 전달됩니다. 애플리케이션에 요청을 계속 전달하려면 $request를 인수로 사용하여 콜백 함수 $next를 호출하면 됩니다.

특정 요구 사항에서는 세 번째 매개변수를 사용하여 추가 매개변수를 전달할 수 있습니다.

<?php
namespace app\http\middleware;
class Check
{
    public function handle($request, \Closure $next, $name)
    {
        if ($name == &#39;think&#39;) {
            return redirect(&#39;index/think&#39;);
        }
        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(&#39;~micromessenger~i&#39;, $request->header(&#39;user-agent&#39;))) {
            $request->InApp = &#39;WeChat&#39;;
        } else if (preg_match(&#39;~alipay~i&#39;, $request->header(&#39;user-agent&#39;))) {
            $request->InApp = &#39;Alipay&#39;;
        }
        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(&#39;hello/:name&#39;,&#39;hello&#39;)
->middleware(&#39;Auth&#39;);

하거나 전체 미들웨어 클래스 이름

Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;)
->middleware(app\http\middleware\Auth::class);

을 사용하여 여러 미들웨어 등록을 지원합니다

Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;)
->middleware([&#39;Auth&#39;, &#39;Check&#39;]);

V5 .1.7+ 버전에서는 애플리케이션 구성 디렉터리의 middleware.php에서 미들웨어를 직접 사전 정의할 수 있습니다(실제로 별칭 식별자 추가). 예:

return [
&#39;auth&#39;=>app\http\middleware\Auth::class,
    &#39;check&#39;=>app\http\middleware\Check::class
];

그런 다음 라우팅에서 직접 미들웨어 별칭 등록을 사용합니다.

Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;)
->middleware([&#39;Auth&#39;, &#39;Check&#39;]);

시작 V5.1.8+부터는 별칭을 사용하여 미들웨어 그룹을 정의할 수 있습니다. 예:

return [
&#39;check&#39;=>[
    app\http\middleware\Auth::class,
   app\http\middleware\Check::class
    ],
];

그런 다음 다음 방법을 직접 사용하여 미들웨어를 등록합니다.

Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;)
->middleware(&#39;check&#39;);

라우팅 그룹에 대한 미들웨어 등록을 지원합니다.

Route::group(&#39;hello&#39;, function(){
Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;);
})->middleware(&#39;Auth&#39;);

V5. + 특정 도메인 이름에 대한 등록 미들웨어 지원 시작

Route::domain(&#39;admin&#39;, function(){
// 注册域名下的路由规则
})->middleware(&#39;Auth&#39;);

미들웨어에 추가 매개변수를 전달해야 하는 경우

Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;)
->middleware(&#39;Auth:admin&#39;);

를 사용하면 됩니다. 상수 정의를 사용하는 경우 두 번째 매개변수에 미들웨어 매개변수를 전달하면 됩니다.

Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;)
->middleware(Auth::class, &#39;admin&#39;);

여러 미들웨어를 정의해야 하는 경우 배열 방법

Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;)
->middleware([Auth::class, &#39;Check&#39;]);

을 사용하여 동일한 추가 매개변수

Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;)
->middleware([Auth::class, &#39;Check&#39;], &#39;admin&#39;);

를 전달하거나 미들웨어 매개변수를 개별적으로 지정하세요.

Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;)
->middleware([&#39;Auth:admin&#39;, &#39;Check:editor&#39;]);

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

미들웨어 클래스를 사용할 필요는 없습니다. 일부 간단한 상황에서는 클로저를 사용하여 미들웨어를 정의할 수 있지만 클로저 함수는 응답 개체 인스턴스를 반환해야 합니다.

Route::group(&#39;hello&#39;, function(){
Route::rule(&#39;hello/:name&#39;,&#39;hello&#39;);
})->middleware(function($request,\Closure $next){
    if ($request->param(&#39;name&#39;) == &#39;think&#39;) {
        return redirect(&#39;index/think&#39;);
    }
    
return $next($request);
});

글로벌 미들웨어

다음 방법을 사용하여 응용 프로그램 디렉터리 아래에 middleware.php 파일을 정의할 수 있습니다.

<?php
return [
\app\http\middleware\Auth::class,
    &#39;Check&#39;,
    &#39;Hello&#39;,
];

미들웨어 등록에는 전체 클래스 이름을 사용해야 합니다. 네임스페이스가 지정되지 않은 경우 apphttpmiddleware를 다음과 같이 사용하세요. 네임스페이스.

글로벌 미들웨어의 실행 순서는 정의 순서입니다. 글로벌 미들웨어 정의 시 미들웨어 매개변수를 전달할 수 있으며, 두 가지 방식을 지원합니다.

<?php
return [
[\app\http\middleware\Auth::class, &#39;admin&#39;],
    &#39;Check&#39;,
    &#39;Hello:thinkphp&#39;,
];

위 정의는 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 = [&#39;Auth&#39;];
    public function index()
    {
        return &#39;index&#39;;
    }
    public function hello()
    {
        return &#39;hello&#39;;
    }
}

인덱스 컨트롤러가 실행되면 인증 미들웨어가 호출되며 전체 네임스페이스 사용도 지원됩니다. 정의.

컨트롤러 중간에 효과적인 동작을 설정해야 한다면 다음과 같이 정의하면 됩니다.

<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
    protected $middleware = [ 
    &#39;Auth&#39; => [&#39;except&#39; => [&#39;hello&#39;] ],
        &#39;Hello&#39; => [&#39;only&#39; => [&#39;hello&#39;] ],
    ];
    public function index()
    {
        return &#39;index&#39;;
    }
    public function hello()
    {
        return &#39;hello&#39;;
    }
}

미들웨어는 컨트롤러에 매개변수를 전달합니다.

컨트롤러(또는 다른 장소)에 매개변수를 전달할 수 있습니다. 요청 개체에 값을 할당합니다(예:

<?php
namespace app\http\middleware;
class Hello
{
    public function handle($request, \Closure $next)
    {
        $request->hello = &#39;ThinkPHP&#39;;
        
        return $next($request);
    }
}

) 전달된 변수 이름이 param 변수와 충돌해서는 안 됩니다.

그러면 컨트롤러 메서드에서 직접 사용할 수 있습니다

public function index(Request $request)
{
return $request->hello; // ThinkPHP
}

이 기사는 ThinkPHP 프레임워크 기술 기사 칼럼에서 가져온 것입니다:http://www.php.cn/phpkj/thinkphp/

위 내용은 thinkphp 미들웨어는 무엇을 의미하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.