"Laravel 라우팅"의 두 판 사이의 차이

440번째 줄: 440번째 줄:


==라우트 그룹==
==라우트 그룹==
라우트 그룹을 사용하면 각 개별 라우트에서 해당 속성을 정의할 필요 없이 미들웨어와 같은 라우트 속성을 다수의 라우트에 걸쳐 공유할 수 있습니다.
중첩된 그룹은 속성을 상위 그룹과 지능적으로 "병합"하려고 시도합니다. 미들웨어와 <code>where</code> 조건은 병합되며, 이름과 접두어는 추가됩니다. 네임스페이스 구분자와 URI 접두어의 슬래시는 적절한 위치에 자동으로 추가됩니다.
===미들웨어===
===미들웨어===
===컨트롤러===
===컨트롤러===
445번째 줄: 449번째 줄:
===라우트 접두어===
===라우트 접두어===
===라우트 이름 접두어===
===라우트 이름 접두어===
==라우트 모델 바인딩==
==라우트 모델 바인딩==
===암시적 바인딩===
===암시적 바인딩===

2024년 6월 17일 (월) 02:38 판

1 개요

Crystal Clear action info.png 작성 중인 문서입니다.
Routing
라우팅

https://laravel.com/docs/11.x/routing

2 기본 라우팅

가장 기본적인 Laravel 라우트는 URI와 클로저를 받아들여, 복잡한 라우팅 설정 파일 없이 매우 간단하고 표현력 있는 방법으로 라우트와 동작을 정의할 수 있습니다:

use Illuminate\Support\Facades\Route;
 
Route::get('/greeting', function () {
    return 'Hello World';
});

2.1 기본 라우트 파일

모든 Laravel 라우트는 라우트 파일에 정의되며, 이 파일들은 routes 디렉토리에 위치합니다. 이 파일들은 애플리케이션의 bootstrap/app.php 파일에 지정된 설정에 따라 Laravel에 의해 자동으로 로드됩니다. routes/web.php 파일은 웹 인터페이스를 위한 라우트를 정의합니다. 이 라우트들은 세션 상태와 CSRF 보호와 같은 기능을 제공하는 web 미들웨어 그룹에 할당됩니다.

대부분의 애플리케이션에서, routes/web.php 파일에 라우트를 정의하는 것으로 시작합니다. routes/web.php에 정의된 라우트는 브라우저에서 정의된 라우트의 URL을 입력하여 접근할 수 있습니다. 예를 들어, 아래의 라우트를 http://example.com/user로 이동하여 접근할 수 있습니다:

use App\Http\Controllers\UserController;
 
Route::get('/user', [UserController::class, 'index']);
API 라우트

애플리케이션이 상태를 유지하지 않는 API를 제공할 경우, install:ap Artisan 명령어를 사용하여 API 라우팅을 활성화할 수 있습니다:

php artisan install:api

install:api 명령어는 Laravel Sanctum을 설치하여 견고하면서도 간단한 API 토큰 인증 가드를 제공하며, 이를 통해 제3자 API 소비자, SPA 또는 모바일 애플리케이션을 인증할 수 있습니다. 또한, install:api 명령어는 routes/api.php 파일을 생성합니다:

Route::get('/user', function (Request $request) {
    return $request->user();
})->middleware('auth:sanctum');

routes/api.php의 라우트는 상태를 유지하지 않으며, api 미들웨어 그룹에 할당됩니다. 추가적으로, 이 라우트들에는 /api URI 접두어가 자동으로 적용되므로, 파일의 모든 라우트에 이를 수동으로 적용할 필요가 없습니다. 애플리케이션의 bootstrap/app.php 파일을 수정하여 접두어를 변경할 수도 있습니다:

->withRouting(
    api: __DIR__.'/../routes/api.php',
    apiPrefix: 'api/admin',
    // ...
)
사용가능한 라우터 메소드

라우터를 사용하면 모든 HTTP 동사에 응답하는 라우트를 등록할 수 있습니다:

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

때로는 여러 HTTP 동사에 응답하는 라우트를 등록해야 할 수도 있습니다. match 메소드를 사용하여 이를 할 수 있습니다. 또는, any 메소드를 사용하여 모든 HTTP 동사에 응답하는 라우트를 등록할 수도 있습니다:

Route::match(['get', 'post'], '/', function () {
    // ...
});
 
Route::any('/', function () {
    // ...
});

Note

같은 URI를 공유하는 여러 라우트를 정의할 때는, get, post, put, patch, delete, options 메소드를 사용하는 라우트를, any, match, redirect 메소드를 사용하는 라우트보다 먼저 정의해야 합니다. 이는 들어오는 요청이 올바른 라우트와 일치하도록 보장합니다.

의존성 주입

라우트의 콜백 시그니처에 필요한 의존성을 타입힌트로 지정할 수 있습니다. 선언된 의존성은 Laravel 서비스 컨테이너에 의해 자동으로 해결되고 콜백에 주입됩니다. 예를 들어, Illuminate\Http\Request 클래스를 타입힌트로 지정하면 현재 HTTP 요청이 라우트 콜백에 자동으로 주입됩니다:

use Illuminate\Http\Request;
 
Route::get('/users', function (Request $request) {
    // ...
});
CSRF 보호

web 라우트 파일에 정의된 POST, PUT, PATCH 또는 DELETE 라우트를 가리키는 모든 HTML 폼에는 CSRF 토큰 필드를 포함해야 합니다. 그렇지 않으면 요청이 거부됩니다. CSRF 보호에 대한 자세한 내용은 CSRF 문서를 참조하십시오:

<form method="POST" action="/profile">
    @csrf
    ...
</form>

2.2 리디렉트 라우트

다른 URI로 리다이렉트되는 라우트를 정의할 때, Route::redirect 메소드를 사용할 수 있습니다. 이 메소드는 간단한 리다이렉트를 수행하기 위해 전체 라우트 또는 컨트롤러를 정의할 필요가 없도록 간편한 방법을 제공합니다:

Route::redirect('/here', '/there');

기본적으로 Route::redirect302 상태 코드를 반환합니다. 선택적인 세 번째 파라미터를 사용하여 상태 코드를 커스터마이징할 수 있습니다:

Route::redirect('/here', '/there', 301);

또는 Route::permanentRedirect 메소드를 사용하여 301 상태 코드를 반환할 수 있습니다:

Route::permanentRedirect('/here', '/there');

Warning

리다이렉트 라우트에서 라우트 파라미터를 사용할 때, 다음 파라미터는 Laravel에 의해 예약되어 사용할 수 없습니다: destinationstatus.

2.3 뷰 라우트

라우트가 단지 를 반환하기만 하면 된다면, Route::view 메소드를 사용할 수 있습니다. 이 메소드는 redirect 메소드처럼 간편한 방법을 제공하여 전체 라우트나 컨트롤러를 정의할 필요가 없습니다. view 메소드는 URI를 첫 번째 파라미터로, 뷰 이름을 두 번째 파라미터로 받습니다. 추가로, 뷰에 전달할 데이터를 배열 형태로 세 번째 파라미터로 제공할 수 있습니다:

Route::view('/welcome', 'welcome');

Route::view('/welcome', 'welcome', ['name' => 'Taylor']);

Warning

뷰 라우트에서 라우트 파라미터를 사용할 때, Laravel에서 예약된 다음 파라미터들은 사용할 수 없습니다: view, data, status, headers.

2.4 라우트 목록 조회

route:list Artisan 명령어를 사용하면 애플리케이션에 정의된 모든 라우트를 쉽게 확인할 수 있습니다:

php artisan route:list

기본적으로, route:list 출력에서는 각 라우트에 할당된 미들웨어가 표시되지 않습니다. 그러나 명령어에 -v 옵션을 추가하면 라우트 미들웨어와 미들웨어 그룹 이름을 표시하도록 Laravel에 지시할 수 있습니다:

php artisan route:list -v

# 미들웨어 그룹을 확장하려면...
php artisan route:list -vv

특정 URI로 시작하는 라우트만 표시하도록 Laravel에 지시할 수도 있습니다:

php artisan route:list --path=api

또한, 명령어 실행 시 --except-vendor 옵션을 제공하여 서드파티 패키지에 의해 정의된 라우트를 숨길 수 있습니다:

php artisan route:list --except-vendor

마찬가지로, --only-vendor 옵션을 제공하여 서드파티 패키지에 의해 정의된 라우트만 표시하도록 지시할 수도 있습니다:

php artisan route:list --only-vendor

2.5 라우팅 커스터마이징

기본적으로, 애플리케이션의 라우트는 bootstrap/app.php 파일에 의해 설정되고 로드됩니다:

<?php

use Illuminate\Foundation\Application;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )->create();


그러나 때로는 애플리케이션의 라우트의 부분집합을 포함하는 완전히 새로운 파일을 정의하고 싶을 수 있습니다. 이를 위해, <cod>withRouting 메소드에 then 클로저를 제공할 수 있습니다. 이 클로저 내에서, 애플리케이션에 필요한 추가 라우트를 등록할 수 있습니다:

use Illuminate\Support\Facades\Route;

->withRouting(
    web: __DIR__.'/../routes/web.php',
    commands: __DIR__.'/../routes/console.php',
    health: '/up',
    then: function () {
        Route::middleware('api')
            ->prefix('webhooks')
            ->name('webhooks.')
            ->group(base_path('routes/webhooks.php'));
    },
)

또는, withRouting 메소드에 using 클로저를 제공하여 라우트 등록을 완전히 제어할 수도 있습니다. 이 인수가 전달되면, 프레임워크에 의해 HTTP 라우트가 전혀 등록되지 않으며, 모든 라우트를 수동으로 등록해야 합니다:

use Illuminate\Support\Facades\Route;

->withRouting(
    commands: __DIR__.'/../routes/console.php',
    using: function () {
        Route::middleware('api')
            ->prefix('api')
            ->group(base_path('routes/api.php'));

        Route::middleware('web')
            ->group(base_path('routes/web.php'));
    },
)

3 라우트 파라미터

3.1 필수 파라미터

라우트 내에서 URI의 세그먼트를 캡처해야 하는 경우가 있습니다. 예를 들어, URL에서 사용자의 ID를 캡처해야 할 수 있습니다. 이 경우 라우트 파라미터를 정의하여 이를 수행할 수 있습니다:

Route::get('/user/{id}', function (string $id) {
    return 'User ' . $id;
});

필요한 만큼 라우트 파라미터를 정의할 수 있습니다:

Route::get('/posts/{post}/comments/{comment}', function (string $postId, string $commentId) {
    // ...
});

라우트 파라미터는 항상 {} 중괄호 안에 넣어야 하며, 알파벳 문자로 구성되어야 합니다. 밑줄(_)도 라우트 파라미터 이름에 사용할 수 있습니다. 라우트 파라미터는 그 순서에 따라 라우트 콜백/컨트롤러에 주입됩니다. 라우트 콜백/컨트롤러 인수의 이름은 중요하지 않습니다.

파라미터 및 의존성 주입

라우트에 Laravel 서비스 컨테이너가 자동으로 주입해야 하는 의존성이 있는 경우, 라우트 파라미터를 의존성 뒤에 나열해야 합니다:

use Illuminate\Http\Request;

Route::get('/user/{id}', function (Request $request, string $id) {
    return 'User ' . $id;
});

3.2 선택 파라미터

때로는 URI에 항상 존재하지 않을 수 있는 라우트 파라미터를 지정해야 할 때가 있습니다. 이럴 때는 파라미터 이름 뒤에 ?를 붙여서 지정할 수 있습니다. 해당 라우트의 변수에 기본 값을 지정해야 합니다:

Route::get('/user/{name?}', function (?string $name = null) {
    return $name;
});
 
Route::get('/user/{name?}', function (?string $name = 'John') {
    return $name;
});

3.3 정규식 제약조건

라우트 인스턴스에서 where 메소드를 사용하여 라우트 파라미터의 형식을 제약할 수 있습니다. where 메소드는 파라미터의 이름과 파라미터가 제약되어야 하는 정규표현식을 인수로 받습니다:

Route::get('/user/{name}', function (string $name) {
    // ...
})->where('name', '[A-Za-z]+');
 
Route::get('/user/{id}', function (string $id) {
    // ...
})->where('id', '[0-9]+');
 
Route::get('/user/{id}/{name}', function (string $id, string $name) {
    // ...
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

편의를 위해, 자주 사용되는 정규표현식 패턴은 헬퍼 메소드를 사용하여 라우트에 빠르게 패턴 제약조건을 추가할 수 있습니다:

Route::get('/user/{id}/{name}', function (string $id, string $name) {
    // ...
})->whereNumber('id')->whereAlpha('name');
 
Route::get('/user/{name}', function (string $name) {
    // ...
})->whereAlphaNumeric('name');
 
Route::get('/user/{id}', function (string $id) {
    // ...
})->whereUuid('id');
 
Route::get('/user/{id}', function (string $id) {
    // ...
})->whereUlid('id');
 
Route::get('/category/{category}', function (string $category) {
    // ...
})->whereIn('category', ['movie', 'song', 'painting']);
 
Route::get('/category/{category}', function (string $category) {
    // ...
})->whereIn('category', CategoryEnum::cases());

들어오는 요청이 라우트 패턴 제약조건과 일치하지 않으면 404 HTTP 응답이 반환됩니다.

글로벌 제약조건

특정 정규표현식에 항상 제약을 받는 라우트 파라미터를 정의하고 싶다면 pattern 메소드를 사용할 수 있습니다. 이러한 패턴은 애플리케이션의 App\Providers\AppServiceProvider 클래스의 boot 메소드에서 정의해야 합니다:

use Illuminate\Support\Facades\Route;
 
/**
 * 애플리케이션 서비스를 부트스트랩합니다.
 */
public function boot(): void
{
    Route::pattern('id', '[0-9]+');
}

패턴이 정의되면 해당 파라미터 이름을 사용하는 모든 라우트에 자동으로 적용됩니다:

Route::get('/user/{id}', function (string $id) {
    // {id}가 숫자일 때만 실행됨...
});
인코딩된 포워드 슬래시

Laravel 라우팅 컴포넌트는 라우트 파라미터 값 내에서 /를 제외한 모든 문자를 허용합니다. 플레이스홀더에 /를 포함하려면 where 조건 정규표현식을 사용하여 명시적으로 허용해야 합니다:

Route::get('/search/{search}', function (string $search) {
    return $search;
})->where('search', '.*');

Warning

인코딩된 포워드 슬래시는 마지막 라우트 세그먼트에서만 지원됩니다.

4 명명된 라우트

명명된 라우트는 특정 라우트에 대한 URL 생성이나 리디렉션을 편리하게 생성할 수 있게 해줍니다. 라우트 정의에 name 메소드를 연결하여 라우트의 이름을 지정할 수 있습니다:

Route::get('/user/profile', function () {
    // ...
})->name('profile');

컨트롤러 액션에 대해 라우트 이름을 지정할 수도 있습니다:

Route::get(
    '/user/profile',
    [UserProfileController::class, 'show']
)->name('profile');

Warning

라우트 이름은 항상 고유해야 합니다.

명명된 라우트로 URL 생성하기

일단 특정 라우트에 이름을 지정하면, Laravel의 routeredirect 헬퍼 함수를 통해 URL이나 리디렉션을 생성할 때 해당 라우트의 이름을 사용할 수 있습니다:

// URL 생성...
$url = route('profile');
 
// 리디렉션 생성...
return redirect()->route('profile');
 
return to_route('profile');

명명된 라우트가 파라미터를 정의하는 경우, 해당 파라미터들을 route 함수의 두 번째 인수로 전달할 수 있습니다. 주어진 파라미터들은 자동으로 생성된 URL의 올바른 위치에 삽입됩니다:

Route::get('/user/{id}/profile', function (string $id) {
    // ...
})->name('profile');
 
$url = route('profile', ['id' => 1]);

배열에 추가 파라미터를 전달하면, 해당 키/값 쌍이 자동으로 생성된 URL의 쿼리 문자열에 추가됩니다:

Route::get('/user/{id}/profile', function (string $id) {
    // ...
})->name('profile');
 
$url = route('profile', ['id' => 1, 'photos' => 'yes']);
 
// /user/1/profile?photos=yes

Note

때로는, 현재 로케일과 같은 URL 파라미터에 대해 요청 전반에 걸쳐 기본값을 지정하고 싶을 수 있습니다. 이를 위해 URL::defaults 메소드를 사용할 수 있습니다.

현재 라우트 검사하기

현재 요청이 특정 명명된 라우트로 라우팅되었는지 확인하려면, Route 인스턴스의 named 메소드를 사용할 수 있습니다. 예를 들어, 라우트 미들웨어에서 현재 라우트 이름을 확인할 수 있습니다:

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
 
/**
 * Handle an incoming request.
 *
 * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
 */
public function handle(Request $request, Closure $next): Response
{
    if ($request->route()->named('profile')) {
        // ...
    }
 
    return $next($request);
}

5 라우트 그룹

라우트 그룹을 사용하면 각 개별 라우트에서 해당 속성을 정의할 필요 없이 미들웨어와 같은 라우트 속성을 다수의 라우트에 걸쳐 공유할 수 있습니다.

중첩된 그룹은 속성을 상위 그룹과 지능적으로 "병합"하려고 시도합니다. 미들웨어와 where 조건은 병합되며, 이름과 접두어는 추가됩니다. 네임스페이스 구분자와 URI 접두어의 슬래시는 적절한 위치에 자동으로 추가됩니다.

5.1 미들웨어

5.2 컨트롤러

5.3 서브도메인 라우팅

5.4 라우트 접두어

5.5 라우트 이름 접두어

6 라우트 모델 바인딩

6.1 암시적 바인딩

6.2 암시적 열거형 바인딩

6.3 명시적 바인딩

7 폴백 라우트

8 레이트 리미팅

8.1 레이트 리미터 정의하기

8.2 라우트에 레이트 리미터 붙이기

9 폼 메소드 스푸핑

10 현재 라우트에 접근하기

11 크로스 오리진 리소스 공유 (CORS)

Laravel은 사용자가 설정한 값으로 CORS OPTIONS HTTP 요청에 자동으로 응답할 수 있습니다. OPTIONS 요청은 애플리케이션의 글로벌 미들웨어 스택에 자동으로 포함된 HandleCors 미들웨어에 의해 자동으로 처리됩니다.

때때로, 애플리케이션의 CORS 설정 값을 커스터마이징해야 할 필요가 있을 수 있습니다. 이를 위해 config:publish Artisan 명령어를 사용하여 cors 설정 파일을 퍼블리싱할 수 있습니다:

php artisan config:publish cors

이 명령어는 애플리케이션의 config 디렉토리에 cors.php 설정 파일을 배치합니다.

Note

CORS와 CORS 헤더에 대한 자세한 내용은 CORS에 관한 MDN 웹 문서를 참조하십시오.

12 라우트 캐싱

애플리케이션을 프로덕션에 배포할 때 Laravel의 라우트 캐싱을 활용해야 합니다. 라우트 캐싱을 사용하면 애플리케이션의 모든 라우트를 등록하는 데 걸리는 시간이 크게 줄어듭니다. 라우트 캐시를 생성하려면 다음과 같이 route:cache Artisan 명령어를 실행하십시오:

php artisan route:cache

이 명령어를 실행한 후에는 요청마다 캐시된 라우트 파일이 로드됩니다. 새로운 라우트를 추가하는 경우에는 새로운 라우트 캐시를 생성해야 한다는 점을 기억하세요. 따라서 route:cache 명령어는 프로젝트 배포 중에만 실행하는 것이 좋습니다.

라우트 캐시를 지우려면 route:clear 명령어를 사용할 수 있습니다:

php artisan route:clear

13 같이 보기

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}