설명
요청 객체 얻기
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() 헬퍼 함수는 두 개의 매개변수를 가집니다:
- name: 얻을 매개변수 이름 (비어 있으면 모든 매개변수의 배열을 얻을 수 있습니다)
- default: 기본값 (첫 번째 매개변수로 얻지 못할 경우 사용할 값)
예시
// 매개변수 name 얻기
$name = input('name');
// 매개변수 name 얻기, 존재하지 않으면 기본값 사용
$name = input('name','장삼');
// 모든 매개변수 얻기
$all_params = input();
원시 요청 POST 본문 얻기
$post = $request->rawBody();
이 기능은 php-fpm
의 file_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');
모든 입력 얻기
post
와 get
의 집합을 포함합니다.
$request->all();
특정 입력 값 얻기
post
와 get
의 집합에서 특정 값을 얻습니다.
$request->input('name', $default_value);
일부 입력 데이터 얻기
post
와 get
의 집합에서 일부 데이터를 얻습니다.
// 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 출력