본 챕터의 코드는 https://github.com/koeunyeon/ci4/tree/request_post_read 에서 보실 수 있습니다.
웹 개발에서는 리소스의 조회를 요청하는 GET
외에도 리소스의 변경을 요청하는 POST
요청도 자주 쓰입니다. 이번 챕터에서는 POST 데이터를 읽는 방법을 확인해 보겠습니다.
흐름은 아래와 같습니다.
데이터를 입력할 폼 화면을 만들어 보겠습니다.
먼저 Sample
컨트롤러에 아래의 메소드를 추가합니다.
/app/Controllers/Sample.php
public function postform(): string
{
return View("/postForm");
}
컨트롤러에서 /postForm
뷰를 반환했으므로 postForm.php
뷰 파일도 생성하겠습니다.
app/Views/postForm.php
<form method="post" action="/sample/postinput"> <!-- // (1) -->
<p>name : <input type="text" name="name" /></p> <!-- // (2) -->
<p>age : <input type="text" name="age" /></p> <!-- // (3) -->
<p><input type="submit" value="입력" /></p> <!-- // (4) -->
</form> <!-- // (5) -->
(1) <form
태그를 통해 <form
태그 내부의 태그 값이 서버로 전송될 때 HTTP 메소드를 POST로 선언(method="POST"
)합니다. 회원가입 버튼이 클릭되면 name, age 두 속성이 서버로 전송됩니다.
<form method="post" action="/sample/postinput">
action
속성은 서버의 URL을 나타냅니다. 위 코드에서는 명시적으로 /sample/postinput 페이지를 지정했습니다.
만약 action
속성이 생략될 경우 현재 페이지가 됩니다. 즉 현재 주소가 /sample/postform URL 이라면 /sample/postform 주소로 <form
태그 내부의 값을 전달하겠다는 의미가 됩니다.
(2) name 입력창을 나타내기 위해 <input type="text"
태그를 사용합니다.
<p>name : <input type="text" name="name" /></p>
name
속성은 서버로 전달되는 키가 됩니다. 만약 사용자가 name입력란에 "ci4"라고 입력했다면, 서버로 전송시에 name=ci4
형태로 전달됩니다.
(3) age 입력창을 나타내기 위해 <input type="text"
태그를 사용합니다. 만약 age 입력란에 "5"라고 입력했다면 서버로 POST 데이터가 전달될 때 age=5
형태로 전달됩니다.
<p>age : <input type="text" name="age" /></p>
(4) <input type="submit"
태그는 클릭하면 서버로 데이터를 제출(submit) 하는 버튼 태그입니다. value
속성은 버튼의 글자를 나타냅니다.
<p><input type="submit" value="입력" /></p>
(5) </form>
태그를 닫았습니다.
</form>
폼 태그 안의 값만 서버로 전달되므로 (5) 이후의 값이 설정되어 있어도 서버로 전달되지 않습니다.
폼 태그 안의 값이 서버에 전달될 때는 POST 데이터이므로 HTTP 본문(body)에 실려 전달됩니다. 형태는 아래와 같습니다.
name=ci4&age=5
GET과 동일한 규격으로 전달되지만 주소창을 통해 전달되는 대신 HTTP 본문에 실려 전달된다는 점이 다릅니다.
마지막으로 HTML 폼에서 호출한 URL /sample/postinput을 처리할 수 있도록 컨트롤러에 메소드를 추가합니다.
/app/Controllers/Sample.php
public function postinput(): void // (1)
{
$input_data = $this->request->getPost(); // (2)
var_export($input_data); // (3)
}
(1) /postform 화면에서 전달받은 데이터를 처리하는 엔드포인트입니다. void
는 "반환값이 없다."라는 의미입니다.
(2) 코드이그나이터4에서 POST 데이터는 $this->request->getPost()
로 읽을 수 있습니다. 기존 PHP에 익숙하다면 $_POST
변수를 떠올리면 됩니다.
(3) var_export
내장 함수로 입력받은 값을 출력해 봅니다. PHP 언어의 특성상 출력은 브라우저로 전달됩니다.
http://localhost:8080/sample/postform URL에 접속해서 확인해 보겠습니다.
이름과 나이를 입력하고 입력 버튼을 클릭해 봅시다.
그대로 따라해보았는데.. 안되네요 ㅠㅠ ..
혹시나 제 소스랑 달라서 안되는건가 보려고 소스받아서 확인해보고있는데
혹시 Routers는 따로 건드시진 않으셨는데 그래도 상관이 없을까요?