미들웨어
ㅋㅋ
- 미들웨어 매개변수
- 종료 가능한 미들웨어
소개
미들웨어는 애플리케이션에 들어오는 HTTP 요청을 필터링하는 편리한 메커니즘을 제공합니다. 예를 들어 Laravel에는 애플리케이션에 대한 사용자 인증을 확인하는 미들웨어가 포함되어 있습니다. 사용자가 인증되지 않으면 미들웨어는 사용자를 로그인 인터페이스로 리디렉션합니다. 그러나 사용자가 인증되면 미들웨어는 애플리케이션에 대한 요청을 추가로 허용합니다.
물론, 신원 인증 외에도 추가적인 미들웨어를 작성하여 다양한 작업을 수행할 수도 있습니다. 예: CORS 미들웨어는 애플리케이션에서 나가는 모든 응답에 적절한 헤더 정보를 추가하는 일을 담당할 수 있습니다. 로깅 미들웨어는 애플리케이션으로 들어오는 모든 요청을 기록할 수 있습니다.
Laravel에는 인증, CSRF 보호 등을 포함한 일부 미들웨어가 함께 제공됩니다. 이러한 모든 미들웨어는
app/Http/Middleware
디렉터리에 있습니다.app/Http/Middleware
目录。定义中间件
通过运行
make:middleware
Artisan 命令来创建新的中间件:php artisan make:middleware CheckAge
该命令会在
app/Http/Middleware
目录下创建一个新的CheckAge
类,在这个中间件中,我们仅允许age
参数大于200
的请求对此路由进行访问,否则,将重定向到home
<?php namespace App\Http\Middleware; use Closure;class CheckAge{ /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if ($request->age <= 200) { return redirect('home'); } return $next($request); } }
正如你所见,假如给定的
age
参数小于或等于200
,这个中间件将返回一个 HTTP 重定向到客户端;否则,请求将进一步传递到应用中。要让请求继续传递到应用程序中(即允许「通过」中间件验证的),只需使用$request
作为参数去调用回调函数$next
。最好将中间件想象为一系列
HTTP
请求,必须经过才能进入你应用的「层」。每一层都会检查请求(是否符合某些条件),(如果不符合)甚至可以(在请求访问你的应用之前)完全拒绝掉。{提示} 所有的中间件都是通过 服务容器,因此,可以在你的中间件的构造函数中键入你需要的任何依赖。
前置 & 后置中间件
中间件是在请求之前或者之后执行,取决于中间件的本身。例如,下面的中间件将在应用处理请求 之前 执行某些任务:
<?php namespace App\Http\Middleware; use Closure;class BeforeMiddleware{ public function handle($request, Closure $next) { // Perform action return $next($request); } }
然而,这个中间件是在应用请求 之后执行某些任务:
<?php namespace App\Http\Middleware; use Closure; class AfterMiddleware{ public function handle($request, Closure $next) { $response = $next($request); // Perform action return $response; } }
注册中间件
全局中间件
如果你希望中间件在应用处理每个 HTTP 请求期间运行。只需要在
app/Http/Kernel.php
中的$middleware
make:middleware
Artisan 명령을 실행하여 미들웨어 정의 새 미들웨어를 생성하려면: 🎜// 在 App\Http\Kernel 类中... protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, ];
🎜이 명령은app/Http/Middleware
디렉토리에 새로운CheckAge
클래스를 생성합니다. 이 미들웨어에서는 <가 있는 요청만 허용합니다. code>age 매개변수가200
보다 크고, 그렇지 않으면home
🎜Route::get('admin/profile', function () { // })->middleware('auth');
🎜으로 리디렉션됩니다. 보시다시피,age
매개변수가200
보다 작거나 같을 경우, 이 미들웨어는 HTTP 리디렉션을 클라이언트에 반환합니다. 그렇지 않으면 요청이 애플리케이션으로 전달됩니다. 요청이 애플리케이션으로 진행되도록 하려면(즉, 미들웨어가 유효성 검사를 "통과"하도록 허용)$request
를 인수로 사용하여 콜백 함수$next
를 호출하면 됩니다. 🎜🎜미들웨어를 애플리케이션의 "계층"에 도달하기 위해 거쳐야 하는 일련의HTTP
요청으로 생각하는 것이 가장 좋습니다. 각 계층은 요청을 확인하고(특정 조건을 충족하는 경우) 애플리케이션에 대한 액세스를 요청하기 전에 완전히 거부할 수도 있습니다(그렇지 않은 경우). 🎜🎜{Tip} 모든 미들웨어는 서비스 컨테이너를 통해 전달되므로 필요한 모든 종속성을 미들웨어 생성자에 입력할 수 있습니다. 🎜
🎜사전 및 사후 미들웨어
🎜미들웨어는 자체 미들웨어에 따라 요청 전후에 실행됩니다. . 예를 들어, 다음 미들웨어는 애플리케이션이 요청을 처리하기 전에 일부 작업을 수행합니다. 🎜Route::get('/', function () { // })->middleware('first', 'second');
🎜 그러나 이 미들웨어는 애플리케이션 요청 후에 일부 작업을 수행합니다. 🎜use App\Http\Middleware\CheckAge; Route::get('admin/profile', function () { // })->middleware(CheckAge::class);
🎜 🎜🎜🎜🎜미들웨어 등록 중🎜🎜🎜🎜🎜글로벌 미들웨어
🎜 애플리케이션이 처리하는 모든 HTTP 요청 중에 미들웨어가 실행되도록 하려는 경우.app/Http/Kernel.php
🎜🎜🎜🎜🎜🎜🎜의$middleware
속성에 이 미들웨어를 나열하세요.라우트에 미들웨어 할당
미들웨어를 지정된 라우트에 할당하고 싶다고 가정해 보겠습니다. 먼저
app/Http/Kernel.php
파일에서 미들웨어에 키를 할당해야 합니다. 기본적으로 Laravel의 내장 미들웨어는 이 클래스의$routeMiddleware
속성 아래에 포함되어 있습니다. 사용자 정의 미들웨어를 추가하려면 이를 목록에 추가하고 사용자 정의 키를 할당하면 됩니다. 예:app/Http/Kernel.php
文件内为该中间件分配一个键。默认情况下,该类中的$routeMiddleware
属性下包含了 Laravel 内置的中间件。若要加入自定义的中间件,只需把它附加到列表后并为其分配一个自定义键。例如:/** * 应用程序的路由中间件组 * * @var array */ protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 'api' => [ ' throttle:60,1', 'auth:api',], ];
一旦在 HTTP 内核中定义好了中间件,就可以通过
middleware
方法将为路由分配中间件:Route::get('/', function () { // })->middleware('web'); Route::group(['middleware' => ['web']], function () { // });
你也可以为路由分配多个中间件:
/** * 中间件的优先级排序列表 * * 将会强制非全局中间件始终保持给定的顺序。 * * @var array */ protected $middlewarePriority = [ \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\Authenticate::class, \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, \Illuminate\Auth\Middleware\Authorize::class,];
分配中间件时,还可以传递完整的类名:
<?php namespace App\Http\Middleware; use Closure;class CheckRole{ /** * 处理传入的参数 * * @param \Illuminate\Http\Request $request * @param \Closure $next * @param string $role * @return mixed */ public function handle($request, Closure $next, $role) { if (! $request->user()->hasRole($role)) { // Redirect... } return $next($request); } }
中间组件
某些时候你可以希望使用一个键把多个中间件打包成一个组,方便将他们应用到路由中去。你可以使用 Http 核心的
$middlewareGroups
属性。Laravel 内置了开箱即用的
web
和api
中间件组,其中包含你可能希望应用于 Web UI 和 API 路由的常用中间件:Route::put('post/{id}', function ($id) { // })->middleware('role:editor');
中间件组可以使用于单个中间件相同的语法分配给路由和控制器操作。同样,中间件使得一次将多个中间件分配给一个路由更加方便:
<?php namespace Illuminate\Session\Middleware; use Closure; class StartSession{ public function handle($request, Closure $next) { return $next($request); } public function terminate($request, $response) { // Store the session data... } }
{提示}
RouteServiceProvider
默认将web
中间件组自动应用到routes/web.php
。Sorting(排序) 中间件
很少情况下,你可能需要中间件以特定的顺序执行,但是当它们被分配到路由时,你无法控制它们的顺序。在这种情况下,可以使用
rrreeeapp/Http/Kernel.php
文件的$middlewarePriority
属性指定中间件优先级:中间件参数
中间件还可以接收其他参数。例如,如果你的应用程序需要在执行给定操作之前验证用户是否为给定的「角色」 ,你可以创建一个
CheckRole
中间件,由它来接收「角色」名称作为附加参数。附加的中间参数应该在
rrreee$next
参数之后传递给中间件:定义路由时通过一个
미들웨어가 HTTP 커널에 정의되면:
rrreeemiddleware
메서드를 통해 경로에 미들웨어를 할당할 수 있습니다.rrreee 경로에 여러 미들웨어를 할당할 수도 있습니다: rrreee
미들웨어를 할당할 때 전체 클래스 이름을 전달할 수도 있습니다:rrreee🎜🎜🎜🎜Middle Components🎜 🎜 때로는 경로에 적용하기 쉽도록 여러 미들웨어를 그룹으로 패키징하는 키를 사용할 수도 있습니다. Http Core의$middlewareGroups
속성을 사용할 수 있습니다. 🎜🎜Laravel에는 즉시 사용 가능한web
및api
미들웨어 그룹이 내장되어 있으며 여기에는 웹 UI 및 API 라우팅에 적용할 수 있는 일반적인 미들웨어가 포함됩니다. 🎜rrreee 🎜 미들웨어 그룹은 개별 미들웨어와 동일한 구문을 사용하여 경로 및 컨트롤러 작업에 할당될 수 있습니다. 마찬가지로 미들웨어를 사용하면 여러 미들웨어를 한 번에 하나의 경로에 쉽게 할당할 수 있습니다. 🎜rrreee🎜{Tip}
🎜🎜🎜RouteServiceProvider
는 기본적으로web
미들웨어 그룹을 자동으로 적용합니다.경로/web.php
. 🎜🎜🎜정렬(sorting) 미들웨어 🎜🎜드물게 미들웨어가 특정 순서에 따라 실행해야 하지만 경로에 할당될 때 순서를 제어할 수는 없습니다. 이 경우app/Http/Kernel.php
파일의$middlewarePriority
속성을 사용하여 미들웨어 우선순위를 지정할 수 있습니다: 🎜rrreee🎜🎜🎜🎜LearnKu.com🎜 웹사이트에 처음 게시되었습니다. 🎜🎜미들웨어 매개변수
🎜미들웨어는 다른 매개변수도 받을 수 있습니다. 예를 들어 애플리케이션이 특정 작업을 수행하기 전에 사용자에게 특정 "역할"이 있는지 확인해야 하는 경우 "역할" 이름을 추가 매개변수로 받는CheckRole
미들웨어를 생성할 수 있습니다. 🎜🎜추가 중간 매개변수는$next
매개변수 다음에 미들웨어에 전달되어야 합니다. 🎜rrreee🎜경로를 정의할 때:
를 전달하여 미들웨어 이름과 매개변수를 구분하세요. 미들웨어 매개변수. 여러 매개변수를 구분하려면 쉼표를 사용하세요. 🎜rrreee🎜🎜🎜🎜🎜🎜종료 가능한 미들웨어
때때로 미들웨어는 HTTP 응답을 준비한 후 일부 작업을 수행해야 할 수도 있습니다. 예를 들어, Laravel에 내장된 "세션" 미들웨어는 응답이 완전히 준비되면 세션 데이터를 스토리지에 기록합니다. 미들웨어에
rrreeeterminate
메소드를 정의하면 응답이 브라우저에 전송될 준비가 된 후 자동으로 호출됩니다.terminate
方法,那么它将会在响应准备发送到浏览器之后自动调用。terminate
方法应该同时接收请求和响应。定义了这个中间件之后,别忘了将它添加到路由列表或者app/Http/Kernel.php
文件的全局中间件中。当你在中间件上调用
terminate
方法的时候, Laravel 将从 服务容器 中解析出一个新的中间件实例。如果在调用handle
和terminate
方法的同时使用相同的中间件实例,请使用容器的singleton
rrreeeterminate
메소드는 요청과 응답을 모두 받아야 합니다. 이 미들웨어를 정의한 후에는app/Http/Kernel.php
파일의 경로 목록이나 전역 미들웨어에 추가하는 것을 잊지 마세요. 이 글은