IncomingRequest Class

IncomingRequest 클래스는 브라우저와 같은 클라이언트의 HTTP 요청(request)에 대한 객체 지향 표현을 제공합니다. 아래 나열된 메소드 외에도 요청(Request)메시지(Message) 클래스의 모든 메소드에 액세스 할 수 있습니다.

Accessing the Request

클래스가 CodeIgniter\Controller를 상속 받았다면 클래스의 request 속성을 통해 요청(request) 클래스 인스턴스에 엑세스할 수 있습니다.

<?php

namespace App\Controllers;

use CodeIgniter\Controller;

class UserController extends Controller
{
    public function index()
    {
        if ($this->request->isAJAX()) {
            // ...
        }
    }
}

컨트롤러가 아닌 곳에서 요청(Request) 객체에 액세스해야 하는 경우 서비스(Services) class를 통해 사본을 얻을 수 있습니다.

<?php

$request = \Config\Services::request();

컨트롤러 이외의 클래스에서 클래스 속성으로 엑세스하고 싶다면 요청(Request)을 종속성으로 전달하는 것이 좋습니다.

<?php

use CodeIgniter\HTTP\RequestInterface;

class SomeClass
{
    protected $request;

    public function __construct(RequestInterface $request)
    {
        $this->request = $request;
    }
}

$someClass = new SomeClass(\Config\Services::request());

요청 유형 결정

요청은 AJAX 요청 또는 커맨드 라인에서의 요청등 여러 유형을 포함할 수 있으며, isAJAX()isCLI() 메소드로 확인할 수 있습니다

<?php

// Check for AJAX request.
if ($request->isAJAX()) {
    // ...
}

// Check for CLI Request
if ($request->isCLI()) {
    // ...
}

Note

isAJAX() 메소드는 X-Requested-With 헤더에 의존하며, JavaScript를 통한 XHR 요청은 경우에 따라 기본적으로 헤더가 전송되지 않습니다. (예: fetch). 이를 해결하는 방법에 대해서는 AJAX 요청(Requests)을 참조하십시오.

getMethod() 메소드를 이용하여 요청중인 HTTP 메소드를 확인할 수 있습니다.

<?php

// Returns 'post'
$method = $request->getMethod();

이 메소드는 기본적으로 소문자(예 : get, post, 등)로 값을 반환합니다.

Note

반환값을 소문자로 변환하는 기능은 사용이 중지되었습니다. 이것은 앞으로의 버전에서 제거될 것이고, 이 방법은 PSR-7에 적합합니다.

strtoupper()함수를 이용하여 대문자로 변환할 수 있습니다.

// Returns 'GET'
$method = strtoupper($request->getMethod());

isSecure() 메소드를 이용하여 HTTPS 연결을 통해 요청이 이루어 졌는지 확인할 수 있습니다.

<?php

if (! $request->isSecure()) {
    force_https();
}

입력 검색

요청(Request) 객체를 통해 $_SERVER, $_GET, $_POST, $_ENV에서 입력을 검색할 수 있습니다. 데이터는 자동으로 필터링되지 않고, 요청으로 전달된 원래 입력 데이터를 그대로 반환합니다.

Note

전역 변수를 사용하는 것은 좋은 전략이 아닙니다. 일반적으로 피하고, Request 객체의 메소드를 사용할 것을 권장합니다.

($_POST['something'])처럼 직접 접근하는 것 대신 요청(Request) 객체를 사용하는 것의 주요 장점은, 항목이 존재하지 않을 경우 null을 반환하고, 데이터를 필터링할 수 있고, 항목이 존재하는지 여부를 체크할 필요 없이 쉽게 데이터를 사용할 수 있습니다. 일반적으로 아래와 같은 코드를 작성할 수 있습니다.

<?php

$something = $_POST['foo'] ?? null;

CodeIgniter의 내장 메소드를 사용하면 간단히 수행 할 수 있습니다.

<?php

$something = $request->getVar('foo');

데이터 얻기

getVar() 메소드는 $_REQUEST에서 데이터를 가져오기 때문에, $_GET, $POST, $_COOKIE에 전달된 데이터(php.ini의 request-order에 따라 다름)를 반환합니다.

Note

요청 헤더 Content-Typeapplication/json으로 설정되어 있는 경우, getVar() 메소드는 $_REQUEST 데이터 대신 JSON 데이터를 반환합니다.

이것은 편리하지만, 종종 더 정확한 메소드(예: POST 데이터를 얻기 위해서는 post() 메소드, GET 데이터를 얻기 위해서는 get() 메소드)를 사용해야 할 수도 있습니다.

  • $request->getGet()

  • $request->getPost()

  • $request->getCookie()

  • $request->getServer()

  • $request->getEnv()

또한 찾는 순서를 제어하는 기능을 유지하면서 $_GET이나 $_POST에서 정보를 검색하는 몇 가지 유틸리티 메서드가 있습니다.

  • $request->getPostGet() - $_POST를 먼저 확인하고, 그 다음에 $_GET을 확인합니다.

  • $request->getGetPost() - $_GET을 먼저 확인하고, 그 다음에 $_POST를 확인합니다.

JSON 데이터 가져오기

getJSON()을 사용하여 php://input의 내용을 JSON으로 가져올 수 있습니다.

Note

들어오는 데이터가 유효한 JSON인지 여부를 확인할 수있는 방법이 없으므로, JSON인 경우에만 이 메소드를 사용해야 합니다.

<?php

$json = $request->getJSON();

기본적으로 JSON 데이터의 모든 객체는 PHP 객체로 반환합니다. 연관 배열로 변환하려면 첫 번째 매개 변수로 true를 전달하십시오.

$json = $request->getJSON(true);

두 번째와 세 번째 매개 변수는 PHP 함수 json_decodedepth, options 매개 변수와 일치합니다.

수신 요청에 Content-Type 헤더가 “application/json”으로 설정된 경우 getVar()를 사용하여 JSON 스트림을 가져올 수 있습니다. 이런식으로 getVar()를 사용하면 항상 객체(oject)가 반환됩니다.

JSON에서 특정 데이터 가져 오기

원하는 데이터에 대해 변수 이름을 getVar()에 전달하면 JSON 스트림에서 특정 데이터를 얻을 수 있으며, dot 표기법을 사용하여 JSON을 탐색하여 루트 레벨이 아닌 데이터를 가져올 수 있습니다.

<?php

/*
 * With a request body of:
 * {
 *     "foo": "bar",
 *     "fizz": {
 *         "buzz": "baz"
 *     }
 * }
 */

$data = $request->getVar('foo');
// $data = "bar"

$data = $request->getVar('fizz.buzz');
// $data = "baz"

결과가 객체 대신 연관 배열이 되도록 하려면 getJsonVar()를 대신 사용하고 두 번째 매개 변수에 true를 전달합니다. 이 기능은 수신 요청에 올바른 Content-Type 헤더가 있는지 확인할 수 없는 경우에도 사용할 수 있습니다.

<?php

// With the same request as above
$data = $request->getJsonVar('fizz');
// $data->buzz = "baz"

$data = $request->getJsonVar('fizz', true);
// $data = ["buzz" => "baz"]

Note

dot 표기법에 대한 자세한 내용은 Array 헬퍼의 dot_array_search() 설명서를 참조하십시오.

원시(raw) 데이터 검색 (PUT, PATCH, DELETE)

마지막으로 getRawInput()을 사용하여 php://input의 내용을 원시(raw) 스트림으로 가져올 수 있습니다

<?php

$data = $request->getRawInput();

다음처럼 데이터를 검색하여 배열로 변환합니다.

<?php

var_dump($request->getRawInput());

/*
 * Outputs:
 * [
 *     'Param1' => 'Value1',
 *     'Param2' => 'Value2',
 * ]
 */

입력 데이터 필터링

어플리케이션의 보안을 유지하려면 액세스하는 모든 입력을 필터링해야 합니다. 위에 설명된 메소드들의 두 번째 매개 변수로 사용할 필터 유형을 전달할 수 있습니다. filter_var()네이티브(native) 함수가 필터링에 사용됩니다. 유효한 필터 유형 목록을 보려면 PHP 매뉴얼로 이동하십시오.

POST 변수를 필터링하면 다음과 같습니다

<?php

$email = $request->getVar('email', FILTER_SANITIZE_EMAIL);

Important

두 번째 매개 변수로 전달된 필터 유형 지원은 위에서 언급한 모든 메소드중 getJSON()을 제외 합니다.

헤더 검색

getHeaders() 메소드로 요청과 함께 전송된 모든 헤더에 액세스 할 수 있습니다. 이 메소드는 키를 헤더 이름으로 사용하여 모든 헤더의 배열을 CodeIgniter\HTTP\Header로 반환합니다.

<?php

var_dump($request->headers());

/*
 * Outputs:
 * [
 *     'Host'          => CodeIgniter\HTTP\Header,
 *     'Cache-Control' => CodeIgniter\HTTP\Header,
 *     'Accept'        => CodeIgniter\HTTP\Header,
 * ]
 */

단일 헤더만 필요한 경우 header() 메소드를 사용합니다. 지정된 헤더 객체가 존재하는 경우 대소문자를 구분하지 않는 방식으로 가져오고, 그렇지 않으면 null을 반환합니다.

<?php

// these are all equivalent
$host = $request->header('host');
$host = $request->header('Host');
$host = $request->header('HOST');

hasHeader()를 사용하여 헤더가 있는지 확인할 수 있습니다.

<?php

if ($request->hasHeader('DNT')) {
    // Don't track something...
}

헤더의 모든 값을 가진 문자열이 필요하다면 getHeaderLine() 메소드를 사용합니다.

<?php

// Accept-Encoding: gzip, deflate, sdch
echo 'Accept-Encoding: ' . $request->getHeaderLine('accept-encoding');

이름과 값을 가진 전체 헤더 문자열이 필요하면 헤더를 문자열로 캐스트(cast)합니다.

<?php

echo (string) $header;

요청 URL

$request->getUri() 메소드를 통해 요청에 대한 현재 URI를 나타내는 URI 객체를 검색할 수 있습니다. 이 객체를 문자열로 캐스트하여 현재 요청에 대한 전체 URL을 얻을 수 있습니다.

<?php

$uri = (string) $request->getUri();

이 객체는 요청의 일부를 얻을 수 있는 모든 기능을 제공합니다.

<?php

$uri = $request->getUri();

echo $uri->getScheme();         // http
echo $uri->getAuthority();      // snoopy:password@example.com:88
echo $uri->getUserInfo();       // snoopy:password
echo $uri->getHost();           // example.com
echo $uri->getPort();           // 88
echo $uri->getPath();           // path/to/page
echo $uri->getQuery();          // foo=bar&bar=baz
print_r($uri->getSegments());   // Array ( [0] => path [1] => to [2] => page )
echo $uri->getSegment(1);       // path
echo $uri->getTotalSegments();  // 3

getPath()setPath() 메소드를 사용하여 현재 URI 문자열(baseURL에 상대적인 경로)로 작업할 수 있습니다. IncomingRequest의 공유 인스턴스에 있는 이 상대 경로는 URL Helper 함수가 사용되므로 테스트를 위해 들어오는 요청을 “스푸핑”하는 데 도움이 됩니다.

<?php

use CodeIgniter\Test\CIUnitTestCase;

final class MyMenuTest extends CIUnitTestCase
{
    public function testActiveLinkUsesCurrentUrl()
    {
        service('request')->setPath('users/list');

        $menu = new MyMenu();

        $this->assertTrue('users/list', $menu->getActiveLink());
    }
}

업로드(Upload) 파일

업로드된 모든 파일에 대한 정보는 $request->getFiles()를 통해 얻을 수 있으며, CodeIgniter\HTTP\Files\UploadedFile 인스턴스의 배열을 반환합니다. 이를 통하여 파일 업로드 작업이 쉬워지고 보안 위험을 최소화할 수 있습니다.

<?php

$files = $request->getFiles();

자세한 내용은 Working with Uploaded Files을 보십시오.

HTML 파일 입력에 지정된 파일 이름을 기반으로 업로드한 파일을 얻을 수 있습니다.

<?php

$file = $request->getFile('userfile');

HTML 파일 입력에 제공된 파일 이름을 기반으로 동일한 이름으로 업로드된 다중 파일 배열 얻을 수 있습니다.

<?php

$files = $request->getFileMultiple('userfile');

Note

여기의 파일은 $_FILES에 해당합니다. 사용자가 양식(form)에 파일을 업로드하지 않고 제출(submit) 버튼을 클릭하여도 파일($_FILES)은 계속 존재합니다. userfile의 isValid() 메소드로 파일이 실제로 업로드 되었는지 확인할 수 있습니다. 자세한 내용은 파일 확인을 참조하세요.

컨텐츠 협상

negotiate() 메소드를 통해 요청된 컨텐츠 유형을 쉽게 협상할 수 있습니다.

<?php

$language    = $request->negotiate('language', ['en-US', 'en-GB', 'fr', 'es-mx']);
$imageType   = $request->negotiate('media', ['image/png', 'image/jpg']);
$charset     = $request->negotiate('charset', ['UTF-8', 'UTF-16']);
$contentType = $request->negotiate('media', ['text/html', 'text/xml']);
$encoding    = $request->negotiate('encoding', ['gzip', 'compress']);

자세한 내용은 콘텐츠 협상 페이지를 참조하십시오.

Class Reference

Note

여기에 나열된 메소드 외에도 이 클래스는 요청(Request) Class메시지(Message) Class 클래스의 메소드를 상속합니다.

사용 가능한 부모(Parent) 클래스가 제공하는 메소드는 다음과 같습니다.:

  • CodeIgniter\HTTP\Request::getIPAddress()

  • CodeIgniter\HTTP\Request::isValidIP()

  • CodeIgniter\HTTP\Request::getMethod()

  • CodeIgniter\HTTP\Request::setMethod()

  • CodeIgniter\HTTP\Request::getServer()

  • CodeIgniter\HTTP\Request::getEnv()

  • CodeIgniter\HTTP\Request::setGlobal()

  • CodeIgniter\HTTP\Request::fetchGlobal()

  • CodeIgniter\HTTP\Message::getBody()

  • CodeIgniter\HTTP\Message::setBody()

  • CodeIgniter\HTTP\Message::appendBody()

  • CodeIgniter\HTTP\Message::populateHeaders()

  • CodeIgniter\HTTP\Message::headers()

  • CodeIgniter\HTTP\Message::header()

  • CodeIgniter\HTTP\Message::hasHeader()

  • CodeIgniter\HTTP\Message::getHeaderLine()

  • CodeIgniter\HTTP\Message::setHeader()

  • CodeIgniter\HTTP\Message::removeHeader()

  • CodeIgniter\HTTP\Message::appendHeader()

  • CodeIgniter\HTTP\Message::prependHeader()

  • CodeIgniter\HTTP\Message::getProtocolVersion()

  • CodeIgniter\HTTP\Message::setProtocolVersion()

class CodeIgniter\HTTP\IncomingRequest
isCLI()
Returns

커맨드 라인 요청 true, 그렇지 않으면 false

Return type

bool

isAJAX()
Returns

AJAX 요청 true, 그렇지 않으면 false

Return type

bool

isSecure()
Returns

HTTPS 요청 true, 그렇지 않으면 false

Return type

bool

getVar([$index = null[, $filter = null[, $flags = null]]])
Parameters
  • $index (string) – 찾을 변수/키의 이름

  • $filter (int) – 적용할 필터 유형, 필터 목록은 여기에서 찾을 수 있습니다.

  • $flags (int) – 적용할 플래그, 플래그 목록은 여기에서 찾을 수 있습니다.

Returns

제공된 매개 변수가 없는 경우 $_REQUEST, 있으면 검색된 REQUEST 값 또는 null

Return type

mixed|null

첫 번째 매개 변수에는 찾고자하는 REQUEST 항목의 이름입니다

<?php

$request->getVar('some_data');

검색하려는 항목이 존재하지 않으면 이 메소드는 널(null)을 리턴합니다.

두 번째 선택적 매개 변수를 사용하면 PHP 필터를 통해 데이터를 필터링할 수 있습니다. 원하는 필터 유형을 두 번째 매개 변수로 전달하십시오.

<?php

$request->getVar('some_data', FILTER_SANITIZE_FULL_SPECIAL_CHARS);

모든 REQUEST 항목의 배열을 반환하려면 매개 변수없이 호출하십시오.

모든 REQUEST 항목을 반환하고 필터를 통해 전달하려면 첫 번째 매개 변수를 null로 설정하고 두 번째 매개 변수를 사용하려는 필터로 설정하십시오.

<?php

$request->getVar(null, FILTER_SANITIZE_FULL_SPECIAL_CHARS);
// returns all POST items with string sanitation

여러 REQUEST 매개 변수의 배열을 반환하려면 필요한 모든 키를 배열로 전달하십시오.

<?php

$request->getVar(['field1', 'field2']);

매개 변수의 배열을 반환할 때 필터링을 사용하고 싶다면, 두 번째 매개 변수에 적용할 필터 유형을 설정하십시오.

<?php

$request->getVar(['field1', 'field2'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
getGet([$index = null[, $filter = null[, $flags = null]]])
Parameters
  • $index (string) – 찾을 변수/키의 이름.

  • $filter (int) – 적용할 필터 유형, 필터 목록은 여기에서 찾을 수 있습니다.

  • $flags (int) – 적용할 플래그, 플래그 목록은 여기에서 찾을 수 있습니다.

Returns

제공된 매개 변수가 없는 경우 $_GET, 있으면 검색된 GET 값 또는 null

Return type

mixed|null

getVar()와 동일하지만, GET 데이터만 가져옵니다.

getPost([$index = null[, $filter = null[, $flags = null]]])
Parameters
  • $index (string) – 찾을 변수/키의 이름

  • $filter (int) – 적용할 필터 유형, 필터 목록은 여기에서 찾을 수 있습니다.

  • $flags (int) – 적용할 플래그, 플래그 목록은 여기에서 찾을 수 있습니다.

Returns

제공된 매개 변수가 없는 경우 $_POST, 있으면 검색된 POST 값 또는 null

Return type

mixed|null

getVar()와 동일하지만, POST 데이터만 가져옵니다.

getPostGet([$index = null[, $filter = null[, $flags = null]]])
Parameters
  • $index (string) – 찾을 변수/키의 이름

  • $filter (int) – 적용할 필터 유형, 필터 목록은 여기에서 찾을 수 있습니다.

  • $flags (int) – 적용할 플래그, 플래그 목록은 여기에서 찾을 수 있습니다.

Returns

제공된 매개 변수가 없는 경우 $_POST$_GET의 결합(충돌 시 POST 값 선택), 그렇지 않으면 POST 값을 찾고, 아무 것도 없으면 GET 값을 찾고, 값이 없으면 null을 반환합니다.

Return type

mixed|null

이 메소드는 getPost(), getGet()와 거의 같은 방식으로 작용하며, 2개의 메소드를 결합한 것입니다. POST에서 먼저 검색하여 발견되지 않으면 GET에서 검색합니다.

<?php

$request->getPostGet('field1');

인덱스를 지정하지 않으면 POST 및 GET 스트림을 결합하여 반환합니다. 이름이 충돌한 경우 POST 데이터가 선택됩니다.

getGetPost([$index = null[, $filter = null[, $flags = null]]])
Parameters
  • $index (string) – 찾을 변수/키의 이름

  • $filter (int) – 적용할 필터 유형, 필터 목록은 여기에서 찾을 수 있습니다.

  • $flags (int) – 적용할 플래그, 플래그 목록은 여기에서 찾을 수 있습니다.

Returns

제공된 매개 변수가 없는 경우 $_GET$_POST 결합(충돌 시 GET 값 선택), 그렇지 않으면 GET 값을 찾고, 아무 것도 없으면 POST 값을 찾고, 값이 없으면 null을 반환합니다.

Return type

mixed|null

이 메소드는 getPost(), getGet()와 거의 같은 방식으로 작용하며, 2개의 메소드를 결합한 것입니다. GET관 POST 스트림 모두를 통해 데이터를 검색하고, 먼저 GET에서 찾은 다음 POST에서 찾습니다.

<?php

$request->getGetPost('field1');

인덱스를 지정하지 않으면 GET 및 POST 스트림을 결합하여 반환합니다. 이름이 충돌한 경우 GET 데이터가 선택됩니다.

getCookie([$index = null[, $filter = null[, $flags = null]]])
Noindex

Parameters
  • $index (mixed) – COOKIE명

  • $filter (int) – 적용할 필터 유형, 필터 목록은 여기에서 찾을 수 있습니다.

  • $flags (int) – 적용할 플래그, 플래그 목록은 여기에서 찾을 수 있습니다.

Returns

제공된 매개 변수가 없는 경우 $_COOKIE, 있으면 검색된 COOKIE 값 또는 null

Return type

mixed

getPost()getGet()과 동일하지만 값을 쿠키(cookie)에서 가져옵니다.

<?php

$request->getCookie('some_cookie');
$request->getCookie('some_cookie', FILTER_SANITIZE_FULL_SPECIAL_CHARS); // with filter

여러 쿠키 값의 배열을 반환하려면 필요한 모든 키를 배열로 전달하십시오.

<?php

$request->getCookie(['some_cookie', 'some_cookie2']);

Note

Cookie Helper 함수 get_cookie()와 달리 이 메소드는 Config\Cookie::$prefix의 값이 앞에 추가되지 않습니다.

getServer([$index = null[, $filter = null[, $flags = null]]])
:noindex:
Parameters
  • $index (mixed) – Value name

  • $filter (int) – 적용할 필터 유형, 필터 목록은 여기에서 찾을 수 있습니다.

  • $flags (int) – 적용할 플래그, 플래그 목록은 여기에서 찾을 수 있습니다.

Returns

검색된 $_SERVER 값 또는 null

Return type

mixed

getPost(), getGet(), getCookie() 메소드와 동일하지만 값을 $_SERVER에서 가져옵니다.

<?php

$request->getServer('some_data');

다수의 $_SERVER 값을 배열로 반환하려면, 필요한 모든 키를 배열로 전달하십시오.

<?php

$request->getServer(['SERVER_PROTOCOL', 'REQUEST_URI']);
getUserAgent([$filter = null])
Parameters
  • $filter (int) – 적용할 필터 유형, 필터 목록은 여기에서 찾을 수 있습니다.

Returns

SERVER 데이터에서 찾은 사용자 에이전트 문자열 또는 null

Return type

mixed

이 메소드는 SERVER 데이터에서 사용자 에이전트(User Agent) 문자열을 리턴합니다.

<?php

$request->getUserAgent();
getPath()
Returns

$_SERVER['SCRIPT_NAME']에 상대적인 현재 URI 경로

Return type

string

IncomingRequest::$uri는 기본 URL에 대한 전체 앱 구성을 인식하지 못할 수 있으므로 “현재 URI”를 결정하는 가장 안전한 메소드입니다.

setPath($path)
Parameters
  • $path (string) – 현재 URI로 사용할 상대 경로

Returns

This Incoming Request

Return type

IncomingRequest

대부분 테스트 목적으로만 사용되며, URI 탐지에 의존하는 대신 현재 요청에 대한 상대 경로 값을 설정할 수 있습니다. 이 메소드를 사용하면 기본 URI 인스턴스도 새로운 경로로 업데이트됩니다.