[CakePHP] Request 와 Response


Study/PHP  2019. 10. 4. 09:00

안녕하세요. 명월입니다.


이 글은 PHP에서 Request 와 Response에 대한 글입니다.


먼저 Request와 Response에 대해 설명하면 Request는 웹 브라우져에서 웹 서버로 요청한 데이터(Header와 Body)이고 Response의 경우는 웹서버에서 웹 브라우져로 응답하는 데이터(Header와 Body)의 정보입니다.

이전에 PHP에서 GET 데이터를 받을 때는 $_GET을 쓰고 POST 데이터의 경우는 $_POST를 사용하고 헤더는 $_SERVER에서 찾으면 되었습니다.

링크 - [PHP] $_SERVER, $GLOBALS, $_GET, $_POST, $_REQUEST, $_COOKIE, $_SESSION, $_FILES, $_ENV(getenv())


위 전역변수들도 Cake에서 물론 사용 가능합니다. 그러나 우리가 데이터의 흐름 구조를 설계하고 관리하기 쉽게 Cake를 사용하는 만큼 내부 객체를 사용해 봅시다.

링크 - https://book.cakephp.org/3.0/en/controllers/request-response.html


Request

웹 브라우져에서 웹 서버로 요청하는 정보입니다.

$this->getRequest()->getAttributes()와 $this->getRequest()->getParam('')

먼저 getParam은 getAttributes의 params의 내용입니다.

<?php
namespace App\Controller;

class HomeController extends AppController{
  public function index(){
    var_dump($this->getRequest()->getAttributes());
    var_dump($this->getRequest()->getParam('controller'));
  }
}

이 getAttributes()와 getParam()은 Route와 Controller간의 정보 공유입니다.

즉, 저 $routes->connect로 보낸 데이터입니다. 저의 경우는 controller와 action 밖에 없지만 저기에 넘겨야 할 데이터가 있다면 뒤에 추가하게 되면 그 데이터를 Controller에서 취득할 수 있습니다.


$this->getRequest()->getQuery()

이 함수는 Url에 붙는 GET String데이터 입니다.

<?php
namespace App\Controller;

class HomeController extends AppController{
  public function index(){
    var_dump($this->getRequest()->getQuery());
  }
}

참고로 여기에 두번째 파리미터까지 사용하면 default치를 설정할 수 있습니다.

<?php
namespace App\Controller;

class HomeController extends AppController{
  public function index(){
    var_dump($this->getRequest()->getQuery());
    // GET String 데이터에 example이 없으면 Nothing을 있으면 GET String데이터를 $data에 넣습니다.
    $data = $this->getRequest()->getQuery("example", "Nothing");
    var_dump($data);
  }
}


$this->getRequest()->getData()

이 함수는 POST 데이터입니다. 사용방법은 위 getQuery()와 같습니다.

<?php
namespace App\Controller;

class HomeController extends AppController{
  public function index(){
    var_dump($this->getRequest()->getData());
    // Form 데이터에 example이 없으면 Nothing을 있으면 Form데이터를 $data에 넣습니다.
    $data = $this->getRequest()->getData("example", "Nothing");
    var_dump($data);
  }
}


$this->getRequest()->is('')

이 함수는 웹의 요청 메서드 타입 체크 함수입니다. 즉, is('post')의 경우는 POST방식의 경우는 true, 그렇지 않으면 false를 반환합니다.

이 탐색이 가능한 키워드는 get, put, patch, post, delete, head, options, ajax, ssl, flash, requested, json, xml이 있습니다.

<?php
namespace App\Controller;

class HomeController extends AppController{
  public function index(){
    var_dump($this->getRequest()->is('get'));
    var_dump($this->getRequest()->is('post'));
  }
}


$this->getRequest()->session()

이 함수는 해당 브라우져의 세션 정보를 가져올 수 있습니다.

<?php
namespace App\Controller;

class HomeController extends AppController{
  public function index(){
    var_dump($this->getRequest()->session());
    // 세션에 Test 키로 Example 데이터를 넣는다.
    $this->getRequest()->session()->write("Test", "Example");
    // 세션에 Test 키로 데이터를 취득한다.
    var_dump($this->getRequest()->session()->read("Test"));
    // 세션을 초기화 한다.
    $this->getRequest()->session()->clear();
    // 세션에 Test 키로 데이터를 취득한다.
    var_dump($this->getRequest()->session()->read("Test"));
  }
}


$this->getRequest()->getCookie('', default), $this->request->getCookieParams()

이 함수는 브라우져 쿠키를 가져오는 함수입니다.

<?php
namespace App\Controller;

class HomeController extends AppController{
  public function index(){
    var_dump($this->getRequest()->getCookieParams());
    var_dump($this->getRequest()->getCookie('TEST', 'Nothing'));
  }
}


특이한 점이 Session cookie가 없네요.. 쿠키 중에 미들웨어 csrf의 토큰 키가 보입니다. 짜증나는 녀석이죠.. ㅎㅎ


Response

웹서버에서 브라우져로 응답하는 정보입니다. 기본적으로 cakePHP는 이 Response를 거진 자동으로 만들어 줍니다.

딱히 사용자가 수정할 영역은 없습니다. 그러나 에러 코드를 보내던가 서버에서 브라우저로 쿠키설정 (Set-Cookie)를 하던가 응답 헤더를 수정할 때 사용합니다.

$this->getResponse()->withType() , $this->getResponse()->withStringBody()

withType과 withStringBody의 반환 값은 Response 타입입니다. PHP는 메모리 참조 방식이 아닌 값 참조 방식으로 돌아가기 때문에 파라미터의 $this->getResponse()의 값과 결과값은 데이터가 다릅니다.

<?php
namespace App\Controller;

class HomeController extends AppController{
  public function index(){
    $response = $this->getResponse()->withType('application/json')->withStringBody(json_encode(['data' => 'hello world']));
    return $response;
  }
}


$this->getResponse()->withStatus(error code);

페이지의 상태코드를 보낼 때 사용됩니다.

<?php
namespace App\Controller;

class HomeController extends AppController{
  public function index(){
    // render를 하고 response를 가져온다.
    $response = $this->render("/Home/index");
    // 상태 코드를 599로 설정하고 리턴한다.
    $response = $response->withStatus(599);
    return $response;
  }
}


$this->getResponse()->withCookie(cookie class);

쿠키를 설정합니다.

<?php
namespace App\Controller;
use Cake\Http\Cookie\Cookie;
use Cake\I18n\Date;

class HomeController extends AppController{
  public function index(){
    // Cookie를 만든다.
    $cookie = new Cookie(
      'ExampleCookie',          // 쿠키이름
      1,                        // 쿠키 값
      new \DateTime('+1 year'), // 만료 시간
      '/',                      // 쿠키 Path
      'localhost',              // 쿠키 도메인
      false,                    // secure only?
      true                      // http only ?
    );
    $response = $this->render("/Home/index");
    $response = $response->withCookie($cookie);
    return $response;
  }
}

그 밖에 Request와 Response에서 지원하는 함수는 엄청 많습니다. 이 포스트에 다 담기에는 내용이 너무 많네요..

링크 - https://book.cakephp.org/3.0/en/controllers/request-response.html


더 필요한 부분은 위 Document를 참조하여 만들면 되겠습니다.


여기까지 PHP에서 Request 와 Response에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.