설명

요청 객체 얻기

webman은 요청 객체를 action 메서드의 첫 번째 매개변수로 자동 주입합니다. 예를 들어서:

예시

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        $default_name = 'webman';
        // GET 요청에서 name 매개변수를 얻어옵니다. name 매개변수가 전달되지 않으면 $default_name을 반환합니다.
        $name = $request->get('name', $default_name);
        // 브라우저에 문자열을 반환합니다.
        return response('hello ' . $name);
    }
}

$request 객체를 통해 요청과 관련된 모든 데이터를 얻을 수 있습니다.

가끔 다른 클래스에서 현재 요청의 $request 객체를 얻으려면, request() 헬퍼 함수를 사용하면 됩니다.

요청 매개변수 get 얻기

전체 GET 배열 얻기

$request->get();

요청에 GET 매개변수가 없으면 빈 배열을 반환합니다.

GET 배열의 특정 값 얻기

$request->get('name');

GET 배열에 이 값이 포함되어 있지 않으면 null을 반환합니다.

GET 메서드의 두 번째 매개변수로 기본값을 전달할 수도 있습니다. GET 배열에서 해당 값을 찾을 수 없으면 기본값을 반환합니다. 예를 들어:

$request->get('name', 'tom');

요청 매개변수 post 얻기

전체 POST 배열 얻기

$request->post();

요청에 POST 매개변수가 없으면 빈 배열을 반환합니다.

POST 배열의 특정 값 얻기

$request->post('name');

POST 배열에 이 값이 포함되어 있지 않으면 null을 반환합니다.

GET 메서드와 마찬가지로, POST 메서드의 두 번째 매개변수로 기본값을 전달할 수도 있습니다. POST 배열에서 해당 값을 찾을 수 없으면 기본값을 반환합니다. 예를 들어:

$request->post('name', 'tom');

헬퍼 함수 input()

$request->input() 함수와 유사하게, 모든 매개변수를 얻을 수 있는 input() 헬퍼 함수는 두 개의 매개변수를 가집니다:

  1. name: 얻을 매개변수 이름 (비어 있으면 모든 매개변수의 배열을 얻을 수 있습니다)
  2. default: 기본값 (첫 번째 매개변수로 얻지 못할 경우 사용할 값)

예시

// 매개변수 name 얻기
$name = input('name');
// 매개변수 name 얻기, 존재하지 않으면 기본값 사용
$name = input('name','장삼');
// 모든 매개변수 얻기
$all_params = input();

원시 요청 POST 본문 얻기

$post = $request->rawBody();

이 기능은 php-fpmfile_get_contents("php://input"); 작업과 유사합니다. HTTP 원시 요청 본문을 얻기 위해 사용됩니다. 이는 비application/x-www-form-urlencoded 형식의 POST 요청 데이터를 얻을 때 매우 유용합니다.

헤더 얻기

전체 헤더 배열 얻기

$request->header();

요청에 헤더 매개변수가 없으면 빈 배열을 반환합니다. 모든 키는 소문자입니다.

헤더 배열의 특정 값 얻기

$request->header('host');

헤더 배열에 이 값이 포함되어 있지 않으면 null을 반환합니다. 모든 키는 소문자입니다.

GET 메서드와 마찬가지로, 헤더 메서드의 두 번째 매개변수로 기본값을 전달할 수도 있습니다. 헤더 배열에서 해당 값을 찾을 수 없으면 기본값을 반환합니다. 예를 들어:

$request->header('host', 'localhost');

쿠키 얻기

전체 쿠키 배열 얻기

$request->cookie();

요청에 쿠키 매개변수가 없으면 빈 배열을 반환합니다.

쿠키 배열의 특정 값 얻기

$request->cookie('name');

쿠키 배열에 이 값이 포함되어 있지 않으면 null을 반환합니다.

GET 메서드와 마찬가지로, 쿠키 메서드의 두 번째 매개변수로 기본값을 전달할 수도 있습니다. 쿠키 배열에서 해당 값을 찾을 수 없으면 기본값을 반환합니다. 예를 들어:

$request->cookie('name', 'tom');

모든 입력 얻기

postget의 집합을 포함합니다.

$request->all();

특정 입력 값 얻기

postget의 집합에서 특정 값을 얻습니다.

$request->input('name', $default_value);

일부 입력 데이터 얻기

postget의 집합에서 일부 데이터를 얻습니다.

// username과 password로 구성된 배열을 얻습니다. 해당 키가 없으면 무시합니다.
$only = $request->only(['username', 'password']);
// avatar와 age를 제외한 모든 입력 받기
$except = $request->except(['avatar', 'age']);

컨트롤러 매개변수를 통한 입력 얻기

<?php
namespace app\controller;
use support\Response;

class UserController
{
    public function create(string $name, int $age = 18): Response
    {
        return json(['name' => $name, 'age' => $age]);
    }
}

코드 로직은 다음과 유사합니다.

<?php
namespace app\controller;
use support\Request;
use support\Response;

class UserController
{
    public function create(Request $request): Response
    {
        $name = $request->input('name');
        $age = (int)$request->input('age', 18);
        return json(['name' => $name, 'age' => $age]);
    }
}

자세한 정보는 컨트롤러 매개변수 바인딩을 참조하십시오.

업로드 파일 얻기


파일을 업로드하려면 multipart/form-data 형식의 양식을 사용해야 합니다.

전체 업로드 파일 배열 얻기

$request->file();

양식은 다음과 유사합니다:

<form method="post" action="http://127.0.0.1:8787/upload/files" enctype="multipart/form-data" />
<input name="file1" multiple="multiple" type="file">
<input name="file2" multiple="multiple" type="file">
<input type="submit">
</form>

$request->file()에서 반환되는 형식은 다음과 같습니다:

array (
    'file1' => object(webman\Http\UploadFile),
    'file2' => object(webman\Http\UploadFile)
)

이것은 webman\Http\UploadFile 인스턴스의 배열입니다. webman\Http\UploadFile 클래스는 PHP 내장 SplFileInfo 클래스를 상속받아 몇 가지 유용한 메서드를 제공합니다.

<?php
namespace app\controller;

use support\Request;

class UploadController
{
    public function files(Request $request)
    {
        foreach ($request->file() as $key => $spl_file) {
            var_export($spl_file->isValid()); // 파일이 유효한지 확인합니다. 예: true | false
            var_export($spl_file->getUploadExtension()); // 업로드 파일의 확장자 예: 'jpg'
            var_export($spl_file->getUploadMimeType()); // 업로드 파일의 MIME 타입 예: 'image/jpeg'
            var_export($spl_file->getUploadErrorCode()); // 업로드 오류 코드를 얻습니다. 예: UPLOAD_ERR_NO_TMP_DIR UPLOAD_ERR_NO_FILE UPLOAD_ERR_CANT_WRITE
            var_export($spl_file->getUploadName()); // 업로드 파일 이름 예: 'my-test.jpg'
            var_export($spl_file->getSize()); // 파일 크기 예: 13364, 단위: 바이트
            var_export($spl_file->getPath()); // 업로드된 디렉토리 예: '/tmp'
            var_export($spl_file->getRealPath()); // 임시 파일 경로 예: `/tmp/workerman.upload.SRliMu`
        }
        return response('ok');
    }
}

주의:

  • 파일이 업로드된 후 임시 파일 이름으로 지정됩니다. 예: /tmp/workerman.upload.SRliMu
  • 업로드 파일 크기는 defaultMaxPackageSize 제한을 받습니다. 기본값은 10M이며, config/server.php 파일에서 max_package_size를 수정하여 기본값을 변경할 수 있습니다.
  • 요청이 끝나면 임시 파일이 자동으로 삭제됩니다.
  • 요청에 업로드된 파일이 없으면 $request->file()은 빈 배열을 반환합니다.
  • 업로드된 파일은 move_uploaded_file() 메서드를 지원하지 않으며, $file->move() 메서드를 사용해야 합니다. 예시를 참조하십시오.

특정 업로드 파일 얻기

$request->file('avatar');

파일이 존재하면 해당 파일의 webman\Http\UploadFile 인스턴스를 반환하고, 그렇지 않으면 null을 반환합니다.

예시

<?php
namespace app\controller;

use support\Request;

class UploadController
{
    public function file(Request $request)
    {
        $file = $request->file('avatar');
        if ($file && $file->isValid()) {
            $file->move(public_path().'/files/myfile.'.$file->getUploadExtension());
            return json(['code' => 0, 'msg' => 'upload success']);
        }
        return json(['code' => 1, 'msg' => 'file not found']);
    }
}

호스트 얻기

요청의 호스트 정보를 얻습니다.

$request->host();

요청 주소가 비표준 80 또는 443 포트인 경우, 호스트 정보에 포트가 포함될 수 있습니다. 예: example.com:8080. 포트가 필요하지 않다면 첫 번째 매개변수에 true를 전달할 수 있습니다.

$request->host(true);

요청 메서드 얻기

 $request->method();

반환값은 GET, POST, PUT, DELETE, OPTIONS, HEAD 중 하나일 수 있습니다.

요청 URI 얻기

$request->uri();

요청의 URI를 반환합니다. 경로와 쿼리 문자열 부분을 포함합니다.

요청 경로 얻기

$request->path();

요청의 경로 부분을 반환합니다.

요청 쿼리 문자열 얻기

$request->queryString();

요청의 쿼리 문자열 부분을 반환합니다.

요청 URL 얻기

url() 메서드는 쿼리 매개변수 없이 URL을 반환합니다.

$request->url();

반환된 값은 //www.workerman.net/workerman-chat과 유사합니다.

fullUrl() 메서드는 쿼리 매개변수가 포함된 URL을 반환합니다.

$request->fullUrl();

반환된 값은 //www.workerman.net/workerman-chat?type=download와 유사합니다.

주의
url()fullUrl()은 프로토콜 부분을 반환하지 않습니다 (http 또는 https 반환하지 않음).
브라우저에서 //example.com과 같은 주소는 현재 사이트의 프로토콜을 자동으로 인식하여 http 또는 https 요청을 자동으로 발생시킵니다.

nginx 프록시를 사용하는 경우, proxy_set_header X-Forwarded-Proto $scheme;를 nginx 설정에 추가하십시오. nginx 프록시를 참조하십시오.
이렇게 하면 $request->header('x-forwarded-proto');를 사용하여 http 또는 https를 판단할 수 있습니다. 예:

echo $request->header('x-forwarded-proto'); // http 또는 https 출력

요청 HTTP 버전 얻기

$request->protocolVersion();

1.1 또는 1.0 문자열을 반환합니다.

요청 세션 ID 얻기

$request->sessionId();

문자와 숫자로 구성된 문자열을 반환합니다.

요청 클라이언트 IP 얻기

$request->getRemoteIp();

요청 클라이언트 포트 얻기

$request->getRemotePort();

요청 클라이언트 실제 IP 얻기

$request->getRealIp($safe_mode=true);

프로젝트가 프록시(예: nginx)를 사용할 때, $request->getRemoteIp()로 얻은 값은 종종 프록시 서버 IP(예: 127.0.0.1, 192.168.x.x)이며 클라이언트의 실제 IP가 아닐 수 있습니다. 이 경우 $request->getRealIp()를 사용하여 클라이언트의 실제 IP를 얻도록 시도할 수 있습니다.

$request->getRealIp()는 HTTP 헤더의 x-forwarded-for, x-real-ip, client-ip, x-client-ip, via 필드에서 실제 IP를 얻으려고 시도합니다.

HTTP 헤더는 쉽게 위조될 수 있으므로, 이 방법으로 얻은 클라이언트 IP는 100% 신뢰할 수 없습니다. 특히 $safe_mode가 false일 때 더욱 그렇습니다. 프록시를 통해 클라이언트의 실제 IP를 얻는 신뢰할 수 있는 방법은 안전한 프록시 서버 IP를 알고, 실제 IP를 어떤 HTTP 헤더가 지니는지 명확히 아는 것입니다. $request->getRemoteIp()가 확인된 안전한 프록시 서버로 반환되면, $request->header('실제 IP를 지닌 HTTP 헤더')를 통해 실제 IP를 가져올 수 있습니다.

서버 IP 얻기

$request->getLocalIp();

서버 포트 얻기

$request->getLocalPort();

AJAX 요청인지 확인

$request->isAjax();

PJAX 요청인지 확인

$request->isPjax();

JSON 반환을 기대하는지 확인

$request->expectsJson();

클라이언트가 JSON 반환을 수용하는지 확인

$request->acceptJson();

요청의 플러그인 이름 얻기

비 플러그인 요청은 빈 문자열 ''을 반환합니다.

$request->plugin;

요청의 애플리케이션 이름 얻기

단일 애플리케이션일 경우 항상 빈 문자열 ''을 반환하며, 다중 애플리케이션일 경우 애플리케이션 이름을 반환합니다.

$request->app;

클로저 함수는 어떤 애플리케이션에도 속하지 않으므로, 클로저 라우트에서의 요청은 $request->app이 항상 빈 문자열 ''을 반환합니다.
클로저 라우트는 라우트를 참조하십시오.

요청의 컨트롤러 클래스 이름 얻기

컨트롤러에 해당하는 클래스 이름을 얻습니다.

$request->controller;

반환된 값은 app\controller\IndexController와 유사합니다.

클로저 함수는 어떤 컨트롤러에도 속하지 않으므로, 클로저 라우트에서의 요청은 $request->controller이 항상 빈 문자열 ''을 반환합니다.
클로저 라우트는 라우트를 참조하십시오.

요청의 메서드 이름 얻기

요청에 해당하는 컨트롤러 메서드 이름을 얻습니다.

$request->action;

반환된 값은 index와 유사합니다.

클로저 함수는 어떤 컨트롤러에도 속하지 않으므로, 클로저 라우트에서의 요청은 $request->action이 항상 빈 문자열 ''을 반환합니다.
클로저 라우트는 라우트를 참조하십시오.

매개변수 재정의

때때로 요청의 매개변수를 재정의하고 싶을 수 있습니다. 예를 들어 요청을 필터링한 다음 요청 객체에 다시 할당하려고 할 때, setGet(), setPost(), setHeader() 메서드를 사용할 수 있습니다.

GET 매개변수 재정의

$request->get(); // 예를 들어 ['name' => 'tom', 'age' => 18] 얻음
$request->setGet(['name' => 'tom']);
$request->get(); // 최종적으로 ['name' => 'tom']을 얻습니다.

주의
예시와 같이, setGet()는 모든 GET 매개변수를 재정의하며, setPost()setHeader()도 동일한 작동을 합니다.

POST 매개변수 재정의

$post = $request->post();
foreach ($post as $key => $value) {
    $post[$key] = htmlspecialchars($value);
}
$request->setPost($post);
$request->post(); // 필터링된 post 매개변수를 얻습니다.

HEADER 매개변수 재정의

$request->setHeader(['host' => 'example.com']);
$request->header('host'); // example.com 출력