미들웨어(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,
    ],
];

추가