>PHP 프레임워크 >ThinkPHP >thinkphp 미들웨어란 무엇인가

thinkphp 미들웨어란 무엇인가

藏色散人
藏色散人원래의
2019-07-04 13:30:347856검색

ThinkPHP는 엔터프라이즈 애플리케이션 개발과 민첩한 WEB 애플리케이션 개발을 단순화하기 위해 탄생했습니다. 2006년 초에 처음 탄생했으며 2007년 설날에 공식적으로 ThinkPHP로 이름이 바뀌었고 Apache2 오픈 소스 계약에 따라 출시되었습니다. ThinkPHP는 탄생부터 단순하고 실용적인 디자인 원칙을 고수해 왔으며 뛰어난 성능과 최소한의 코드를 유지하면서도 사용 편의성에도 중점을 두었습니다. 그리고 커뮤니티 팀의 적극적인 참여로 많은 독창적인 기능과 특징을 가지고 있으며 사용 편의성, 확장성 및 성능 측면에서 지속적으로 최적화되고 개선됩니다.

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(&#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;
    }
}

좀 더 실제적인 예를 들어보겠습니다 , 현재 브라우저 환경이 WeChat인지 Alipay인지 확인해야 합니다.

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

을 통해 관련 값을 얻을 수 있습니다. 미들웨어 등록

라우팅 미들웨어

가장 일반적으로 사용되는 미들웨어 등록 방법은 라우팅 미들웨어 등록

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;);

Support 라우팅 그룹화 등록 미들웨어

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

V5.1.8+ 버전은 특정 도메인 이름에 대한 등록 미들웨어를 지원하기 시작합니다

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);
});

Global middleware

다음 방법을 사용하여 응용 프로그램 디렉터리 아래에 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 이상부터 모듈 미들웨어 정의가 지원됩니다. 모듈 디렉터리 아래에 직접 미들웨어를 추가할 수 있습니다. PHP 파일은 애플리케이션 미들웨어 정의와 동일한 방식으로 정의되지만 이 모듈에서만 적용됩니다.

Controller middleware

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으로 문의하세요.