URL 생성

시작하기

라라벨은 애플리케이션에서 URL을 생성하는 것을 도와주는 몇가지 헬퍼 함수를 제공합니다. 당연하게도, 이는 템플릿 안에서 API 응답을 위한 링크를 생성하거나, 애플리케이션의 다른 곳으로 이동하는 리다이렉트 응답-response를 생성할 때 유용하게 사용됩니다.

기본적인 내용

기본 URL 생성하기

url 헬퍼는 애플리케이션에서 사용하는 임의의 URL을 생성하는데 사용합니다. 생성된 URL은 자동으로 현재 요청-request의 (HTTP 또는 HTTPS) 스키마와 호스트를 사용합니다:

$post = App\Post::find(1);

echo url("/posts/{$post->id}");

// http://example.com/posts/1

현재 URL 엑세스하기

url 헬퍼에 아무런 경로를 지정하지 않는다면, Illuminate\Routing\UrlGenerator 인스턴스가 반환되며, 현재 URL에 대한 정보에 엑세스 할 수 있습니다:

// Get the current URL without the query string...
echo url()->current();

// Get the current URL including the query string...
echo url()->full();

// Get the full URL for the previous request...
echo url()->previous();

각각의 메소드는 URL 파사드를 통해서도 엑세스 할 수 있습니다:

use Illuminate\Support\Facades\URL;

echo URL::current();

이름이 지정된 라우트 URL

route 헬퍼 함수는 이름이 지정된 라우트에 대한 URL을 생성하는데 사용할 수 있습니다. 라우트에 이름을 지정하여 사용하면, 라우트에 정의된 실제 URL에 구애받지 않고서도 URL을 생성할 수 있습니다. 따라서 라우트의 URL이 변경되었다고 해서 route 함수를 호출한 곳을 모두 수정할 필요가 없습니다. 예를 들자면 애플리케이션에서 다음과 같이 정의된 라우트를 가지고 있다고 가정해보십시오:

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

이 라우트에 대한 URL을 생성하려면 route 헬퍼 함수를 다음과 같이 사용하면 됩니다:

echo route('post.show', ['post' => 1]);

// http://example.com/post/1

여러분은 종종 Eloquent 모델의 기본 키를 사용하여 URL을 생성하게 될 겁니다. 이러한 이유로, 파라미터 값으로 Eloquent 모델을 전달할 수도 있습니다. route 헬퍼 함수는 자동으로 모델의 기본 키를 추출하여 사용합니다:

echo route('post.show', ['post' => $post]);

route 헬퍼는 여러개의 파라메터를 가진 라우트의 URL를 생성하는 데도 사용할 수 있습니다:

Route::get('/post/{post}/comment/{comment}', function () {
    //
})->name('comment.show');

echo route('comment.show', ['post' => 1, 'comment' => 3]);

// http://example.com/post/1/comment/3

서명이 적용된 (signed) URL

라라벨에서는 이름이 지정된 라우트(named routed)에 "서명이 적용된(signed)" URL을 손쉽게 만들 수 있습니다. 이러한 URL에는 "서명이 적용된" 해쉬가 쿼리 스트링뒤에 추가되어 URL이 생성된 이후에 수정되지 않았음을 확인할 수 있게 합니다. 서명이 적용된 URL은 공개적으로 엑세스가 가능하지만 조작에 대한 보호 레이어가 필요한 라우트에 특별히 유용합니다

예를 들어, 여러분은 서명이 적용된 URL을 고객들이 이메일을 보내는 공개된 "구독 취소" 링크를 구현하는데 사용할 수 있습니다. 이름이 지정된 라우트에 서명이 적용된 URL을 구성하려면, URL 파사드에 signedRoute 메소드를 사용하면 됩니다:

use Illuminate\Support\Facades\URL;

return URL::signedRoute('unsubscribe', ['user' => 1]);

여러분은 temporarySignedRoute 메소드를 사용하여, 임시적으로 생성되어 만료되는, 서명이 적용된 라우트 URL을 생성할 수 있습니다:

use Illuminate\Support\Facades\URL;

return URL::temporarySignedRoute(
    'unsubscribe', now()->addMinutes(30), ['user' => 1]
);

서명이 적용된 라우트 Request-요청 Validting-유효성검사하기

유입되는 request-요청이 유효한 서명이 있는지 확인하기 위해서는 유입되는 RequesthasValidSignature 메소드를 호출해야 합니다:

use Illuminate\Http\Request;

Route::get('/unsubscribe/{user}', function (Request $request) {
    if (! $request->hasValidSignature()) {
        abort(401);
    }

    // ...
})->name('unsubscribe');

또는, 라우트에 Illuminate\Routing\Middleware\ValidateSignature 미들웨어를 지정할 수도 있습니다. 이 미들웨어가 존재하지 않는다면, HTTP 커널의 routeMiddleware 배열에 이 미들웨어를 지정해야 합니다:

/**
 * The application's route middleware.
 *
 * These middleware may be assigned to groups or used individually.
 *
 * @var array
 */
protected $routeMiddleware = [
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
];

커널에 미들웨어를 등록한다음, 라우트에 이 미들웨어를 추가해야 합니다. 유입되는 request-요청에 유효한 서명이 없다면, 미들웨어는 자동으로 403 오류 response-응답을 반환합니다:

Route::post('/unsubscribe/{user}', function (Request $request) {
    // ...
})->name('unsubscribe')->middleware('signed');

컨트롤러 액션 URL

action 함수는 주어진 컨트롤러 액션에 대한 URL을 생성합니다. 컨트롤러의 전체 네임스페이스를 전달할 필요는 없습니다. 대신에 App\Http\Controllers 네임스페이스로부터 시작하는 컨트롤러 클래스 이름을 전달하십시오:

$url = action('HomeController@index');

"callable" 배열 문법을 통해서 액션을 참조하도록 할 수 있습니다:

use App\Http\Controllers\HomeController;

$url = action([HomeController::class, 'index']);

컨트롤러 메소드가 라우트 파라미터 인자를 필요로 한다면, 함수의 두번째 인자로 이를 전달할 수 있습니다:

$url = action('UserController@profile', ['id' => 1]);

기본값

몇몇 애플리케이션에서는 특정 URL 파라미터에 대해 요청-reqeust 전의 기본값을 지정할 수 있습니다. 예를 들어, 다수의 라우트에서 {locale} 파라미터를 정의한다고 가정해보겠습니다:

Route::get('/{locale}/posts', function () {
    //
})->name('post.index');

route 헬퍼를 호출할 때마다 locale 을 전달해야 하는 것은 번거로운 일일 수 있습니다. 따라서 URL::defaults 메소드를 사용하여 현재 요청-request 중에서 항상 적용될 파라미터의 기본값을 정의 할 수 있습니다. 라우트 미들웨어에서 이 메소드를 호출하여 현재의 요청-request에 엑세스 할 수 있습니다:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\URL;

class SetDefaultLocaleForUrls
{
    public function handle($request, Closure $next)
    {
        URL::defaults(['locale' => $request->user()->locale]);

        return $next($request);
    }
}

locale 파라미터의 기본값이 설정되면 rotue 헬퍼를 통해서 URL을 생성 할 때 더 이상 매번 값을 전달하지 않아도 됩니다.