상세 컨텐츠

본문 제목

라라벨 미들웨어 (Laravel Middleware) 사용법 with Laravel 11.x

Framework/Laravel

by code_down 2024. 5. 16. 16:46

본문

미들웨어란 ?

어플리케이션에 들어오는 요청 (Request) 을 필터링하는 데에 사용된다.

예를 들면, 한 유저가 로그인이 된 채로 요청을 보내면 문제 없이 접속할 수 있지만,

로그인이 되어 있지 않은 요청이 오면 인증 미들웨어 (Auth Middleware) 는 로그인 페이지로 리다이렉션을 수행할 수 있다.

 

 

라라벨 미들웨어 사용법

1. 미들웨어 생성

php artisan make:middleware ExampleMiddleware

app/Http/Middleware 에 파일이 생성됩니다.

 

2. 미들웨어 작업 내용 작성

  • 어플리케이션 작업 전에 실행되게 하고싶을 때
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class ExampleMiddleware
{
    public function handle(Request $request, Closure $next): Response
    {
        /**
         *  어플리케이션이 요청을 처리하기 전에 작업을 수행하게 하는 로직
         */
        return $next($request);
    }
}

 

  • 어플리케이션 작업 후에 실행되게 하고싶을 때
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class ExampleMiddleware
{
    public function handle(Request $request, Closure $next): Response
    {
        $response = $next($request);
        /**
         *  어플리케이션이 요청을 처리한 후 작업을 수행하게 하는 로직
         */
        return $response;
    }
}

 

3. 미들웨어 등록

전역 미들웨어

애플리케이션에 대한 모든 HTTP 요청 중에 미들웨어가 실행되도록 하려면 bootstrap/app.php 파일의 전역 미들웨어 스택에 추가하면 됩니다.

<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use App\Http\Middleware\ExampleMiddleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        api: __DIR__.'/../routes/api.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->append(ExampleMiddleware::class);
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

 append 메서드는 전역 미들웨어 목록의 끝에 미들웨어를 추가합니다.

목록의 시작 부분에 미들웨어를 추가하려면 이 prepend메소드를 사용해야 합니다.

 

경로에 미들웨어 할당

ex) 단일 미들웨어 할당

use App\Http\Middleware\ExampleMiddleware;
 
Route::get('/profile', function () {
    // ...
})->middleware(ExampleMiddleware::class);

 

ex) 복수의 미들웨어 할당

Route::get('/', function () {
    // ...
})->middleware([First::class, Second::class]);

 

ex) 경로에서 미들웨어 제외

use App\Http\Middleware\ExampleMiddleware;
 
Route::middleware([ExampleMiddleware::class])->group(function () {
    Route::get('/', function () {
        // ...
    });
 
    Route::get('/profile', function () {
        // ...
    })->withoutMiddleware([ExampleMiddleware::class]);
});

이 방법은 경로 미들웨어만 제거할 수 있으며 전역 미들웨어에는 적용되지 않습니다 .

 

  • 그룹 미들웨어 (여러 미들웨어를 단일 키로 그룹화할 수도 있습니다.)
<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use App\Http\Middleware\ExampleMiddleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        api: __DIR__.'/../routes/api.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->appendToGroup('group-name', [
           ExampleMiddleware::class,
           //미들웨어 추가
        ]);
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

 

경로에 그룹 미들웨어 할당

Route::get('/', function () {
    // ...
})->middleware('group-name');
 
Route::middleware(['group-name'])->group(function () {
    // ...
});

 

 

라라벨 공식 미들웨어 메뉴얼 : https://laravel.com/docs/11.x/middleware