‘운영 체제에서 제공하는 서비스 외의 서비스를 애플리케이션에 제공하는 소프트웨어’로 서로 다른 애플리케이션이 서로 통신하는 데 사용되는 소프트웨어를 의미한다.
라라벨에서 미들웨어는 애플리케이션으로 들어온 HTTP 요청을 간편하게 필터링할 수 있는 방법을 제공하는 역할을 한다.
예를 들어, 로그인 확인 미들웨어는 로그인 되지 않은 사용자는 로그인 페이지로 이동시키고, 로그인된 사용자는 다른 서비스를 이용할 수 있도록 해 줄 것이다.
미들웨어 디렉토리는 app/Http/Middleware 에 있다.
나이를 체크하는 미들웨어를 만들어보자.
우선 artisan 을 이용해 CheckAge 라는 이름의 미들웨어를 생성해준다.
php artisan make:middleware CheckAge
그럼 app/Http/Middleware 디렉토리에 CheckAge.php 라는 이름의 미들웨어 파일 만들어진다.
<?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);
}
}
이와 같이 코드를 구성하면 나이가 200 이하인 사용자는 ‘home’으로 이동시키는 미들웨어가 만들어진다.
미들웨어는 애플리케이션 이후/이전 중 언제 실행될지 타이밍을 선택할 수 있다.
// 이전
class BeforeMiddleware
{
public function handle($request, Closure $next)
{
// Perform action
return $next($request);
}
}
// 이후
class AfterMiddleware
{
public function handle($request, Closure $next)
{
$response = $next($request);
// Perform action
return $response;
}
}
미들웨어를 전역으로 사용하기 위해 app/Http/Kernel.php 안에 아래 코드처럼 미들웨어를 등록한다.
protected $routeMiddleware = [
'checkAge' => CheckAge::class,
];
라우트에 middleware 메소드를 사용하여 미들웨어를 지정할 수 있다.
Route::get('admin/profile', function () {
//
})->middleware('auth');
라우트에 여러개의 미들웨어를 지정할 수도 있다.
Route::get('/', function () {
//
})->middleware('first', 'second');
미들웨어를 지정할 때, 전체 클래스 이름을 전달할 수도 있다.
use App\Http\Middleware\CheckAge;
Route::get('admin/profile', function () {
//
})->middleware(CheckAge::class);