HTTP Requests

Request 엑세스 하기

의존성 주입을 통해서 현재 HTTP request의 인스턴스를 획득하기 위해서는 컨트롤러 생성자나 메소드에서 Illuminate\Http\Request 클래스를 타입힌트해야 합니다. 현재 request의 인스턴스는 서비스 컨테이너에 의해서 자동으로 주입될 것입니다.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;

class UserController extends Controller
{
    /**
     * Store a new user.
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request)
    {
        $name = $request->input('name');

        //
    }
}

만약 컨트롤러 메소드에서 라우터 파라미터로 부터 값을 받아야 한다면 의존성을 지정한 뒤에 라우트 인자를 나열하면 됩니다. 예를 들어 다음과 같이 라우트가 정의되어 있을 수 있습니다:

Route::put('user/{id}', 'UserController@update');

다음과 같이 컨트롤러 메소드를 정의하면 Illuminate\Http\Request를 타입힌트하여 라우트 파라미터 id에 접근할 수 있습니다:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;

class UserController extends Controller
{
    /**
     * Update the specified user.
     *
     * @param  Request  $request
     * @param  int  $id
     * @return Response
     */
    public function update(Request $request, $id)
    {
        //
    }
}

기본적인 Request 정보

Illuminate\Http\Request 인스턴스는 애플리케이션의 HTTP request를 검사할 수 있는 다양한 메소드를 제공합니다. 라라벨의 Illuminate\Http\RequestSymfony\Component\HttpFoundation\Request 클래스를 상속합니다. 다음은 이 클래스에 사용할 수 있는 몇몇 유용한 메소드입니다.

Request URI 조회하기

path 메소드는 request의 URI를 반환합니다. 따라서 들어오는 request가 http://domain.com/foo/bar를 대상으로 한다면 path 메소드는 foo/bar를 반환합니다:

$uri = $request->path();

is 메소드는 들어오는 request가 특정 패턴에 상응한다는 것을 확인할 수 있게 해줍니다. 이 메소드를 활용할 때 * 기호를 와일드카드로 쓸 수 있습니다:

if ($request->is('admin/*')) {
    //
}

경로 정보뿐만 아니라 전체 URL를 가져오려면 request 인스턴스에 url 메소드를 사용하면 됩니다:

$url = $request->url();

Request HTTP 메소드 조회하기

method 메소드는 request에 대해 HTTP 메소드를 반환합니다. HTTP 메소드가 특정 문자열에 대응하는 것을 확인하기 위해 isMethod 메소드 또한 사용할 수 있습니다:

$method = $request->method();

if ($request->isMethod('post')) {
    //
}

PSR-7 Requests

PSR-7 표준은 요청과 응답을 포함한 HTTP 메세지들에 대한 인터페이스를 지정합니다. PSR-7 요청의 인스턴스를 갖기 위해서는 우선 몇 개의 라이브러리를 설치해야 합니다. 라라벨은 Symfony HTTP Message Bridge 컴포넌트를 사용하여 라라벨의 전형적인 요청과 응답을 PSR-7에 맞는 구현체로 변환합니다.

composer require symfony/psr-http-message-bridge

composer require zendframework/zend-diactoros

이 라이브러리들을 설치하였다면 단순히 request를 라우트나 컨트롤러에 타입힌트하는 것만으로도 PSR-7 request를 얻을 수 있습니다.

use Psr\Http\Message\ServerRequestInterface;

Route::get('/', function (ServerRequestInterface $request) {
    //
});

라우트나 컨트롤러에서 반환된 PSR-7 response 인스턴스는 자동으로 라라벨 response 인스턴스로 변환되어 프레임워크에 표시될 것입니다.

입력값 조회하기

입력값 조회하기

몇 개의 단순한 메소드들을 사용하면 Illuminate\Http\Request 인스턴스에서 모든 사용자 입력에 접근할 수 있습니다. 입력은 모든 HTTP 메소드에 대해서 동일한 방식으로 엑세스 되기 때문에 request를 위해 사용된 HTTP 메소드에 대해서는 전혀 걱정할 필요가 없습니다:

$name = $request->input('name');

대체적으로 Illuminate\Http\Request 인스턴스의 속성들을 사용하여 사용자 입력에 접근할 수 있습니다. 예를 들어, 애플리케이션 폼 중 하나가 name 필드를 포함한다면 다음과 같이 전달된 필드의 값에 접근할 수 있습니다:

$name = $request->name;

input 메소드에 두번째 인자로 기본값을 전달할 수 있습니다. Request에 요청된 입력 값이 존재하지 않는다면 기본값이 반환됩니다:

$name = $request->input('name', 'Sally');

배열 입력을 가진 폼에서 동작할 때에는, 배열에 접근하기 위하여 "dot" 표기법을 사용할 수 있습니다:

$input = $request->input('products.0.name');

입력값이 존재하는지 확인하기

Request에 어떤 값이 존재하는지 확인하기 위해서 has 메소드를 사용할 수 있습니다. 값이 존재하면서 문자열이 비어있지 않을 때에만 has 메소드는 true를 반환합니다:

if ($request->has('name')) {
    //
}

모든 입력 데이터 조회하기

또한 all 메소드를 이용하여 모든 입력 데이터를 배열 형태로 조회할 수 있습니다.

$input = $request->all();

입력 데이터의 한 부분 조회하기

입력 데이터의 일부분만 조회하기 위해서 onlyexcept 메소드를 사용할 수 있습니다. 이 두 메소드 모두 하나의 배열 또는 동적인 인자의 목록을 받아 들입니다:

$input = $request->only(['username', 'password']);

$input = $request->only('username', 'password');

$input = $request->except(['credit_card']);

$input = $request->except('credit_card');

이전 입력값 확인하기

라라벨은 한 request의 입력을 다음 request 중에도 유지할 수 있도록 해줍니다. 이 기능은 특히 유효성 검사 오류를 감지한 후 폼을 다시 채워 넣을 때 유용합니다. 하지만 라라벨에 포함된 유효성 검사 서비스를 이용한다면 몇몇 유효성 검사 기능들이 자동으로 이 기능을 호출하기 때문에 수동으로 이 메소드들을 사용해야 할 가능성은 낮습니다:

입력값을 세션에 임시 저장하기

Illuminate\Http\Request 인스턴스의 flash 메소드는 현재의 입력들을 세션에 저장하여, 사용자의 다음 request 동안에도 값을 사용할 수 있게 해줍니다:

$request->flash();

flashOnlyflashExcept 메소드를 이용하여 request 데이터의 부분을 세션에 임시 저장(flash)할 수 있습니다.

$request->flashOnly('username', 'email');

$request->flashExcept('password');

리다이렉트 할 때 입력값을 세션에 임시저장하기

대부분 이전 페이지로 리다이렉트 하면서 입력값을 임시 저장 하기를 원하기 때문에, 이를 위해 리다이렉트와 함께 입력값 임시 저장을 메소드 체이닝으로 사용할 수 있습니다.

return redirect('form')->withInput();

return redirect('form')->withInput($request->except('password'));

이전 데이터 조회하기

이전 Request 에서 저장된 입력값을 검색하기 위해서는 Request 인스턴스의 old 메소드를 사용하면 됩니다. old 메소드는 세션에 저장된 입력 데이터를 불러오기 위한 편리한 헬퍼를 제공합니다:

$username = $request->old('username');

라라벨은 글로벌 old 헬퍼 함수도 제공합니다. 블레이드 템플릿 안에서 지난 입력값을 보여주려면 old 헬퍼 함수를 사용하는 것이 보다 편리합니다.

{{ old('username') }}

쿠기

Request 에서 쿠키 조회하기

모든 쿠키는 라라벨 프레임워크에서 인증 코드와 함께 암호화 됩니다. 이 것은 클라이언트가 변경되었을 때는, 쿠키가 유효하지 않다는 것을 의미합니다. Request에서 쿠키 값을 가져오기 위해서는 Illuminate\Http\Request 인스턴스에서 cookie 메소드를 사용하면 됩니다:

$value = $request->cookie('name');

새로운 쿠키를 Response 에 추가하기

라라벨은 새로운 Symfony\Component\HttpFoundation\Cookie 인스턴스를 생성하기 위한 간단한 팩토리의 역할을 하는 글로벌 cookie 헬퍼 함수를 제공합니다. 쿠키를 Response 인스턴스에 추가하려면 withCookie 메소드를 사용하면 됩니다:

$response = new Illuminate\Http\Response('Hello World');

$response->withCookie(cookie('name', 'value', $minutes));

return $response;

5년 동안 오랫동안 유지되는 쿠키를 만드려면 우선 인자 없이 cookie 헬퍼를 호출하고 forever 메소드를 반환된 쿠키 팩토리에 체이닝하면 됩니다:

$response->withCookie(cookie()->forever('name', 'value'));

파일처리

업로드된 파일 조회하기

file 메소드를 사용하여 Illuminate\Http\Request 인스턴스에 포함된 업로드된 파일에 접근할 수 있습니다. file 메소드로 반환된 객체는 파일과 상호작용할 수 있는 다양한 메소드를 제공하는 Symfony\Component\HttpFoundation\File\UploadedFile 클래스의 인스턴스이며 PHP SplFileInfo 클래스를 상속하고 입니다:

$file = $request->file('photo');

파일 존재 확인하기

hasFile 메소드를 사용하면 request에 파일을 가지고 있는지 확인할 수도 있습니다. if ($request->hasFile('photo')) { // }

성공적인 업로드 확인하기

파일의 존재 여부를 확인하는 것에 더하여, isValid 메소드를 통해 파일이 문제 없이 업로드 되었다는 것을 확인할 수 있습니다:

if ($request->file('photo')->isValid()) {
    //
}

업로드된 파일 이동하기

업로드된 파일을 새로운 위치로 옮기려면 move 메소드를 사용하면 됩니다. 이 메소드는 파일을 (PHP 설정에 따라) 임시업로드 위치에서 사용자가 원하는 위치로 옮겨집니다:

$request->file('photo')->move($destinationPath);

$request->file('photo')->move($destinationPath, $fileName);

기타 파일 관련 메소드들

UploadedFile 인스턴스에 다양한 다른 메소드들이 제공되어 있습니다. 이 메소드들에 대해 더 많은 정보를 얻으려면 클래스의 API documentation을 확인해보십시오.