요청(Request)과 응답(Reponse) 객체

CakePHP2.0에서 새롭게 요청과 응답 객체가 추가되었습니다. 이전 버전에서는 이러한 개체는 배열로 표현되고 있으며 관련 메소드는 RequestHandlerComponent, Router, Dispatcher, Controller 에 분산되어있었습니다. 따라서 요청에 어떤 정보가 포함되어 있는지를 정확히 나타내는 개체는 존재하지 않았습니다. 버전 2.0에서 CakeRequest 과 CakeResponse 는 위의 목적으로 사용됩니다.

CakeRequest

CakeRequest 는 CakePHP에서 사용되는 기본 요청 개체입니다. 요청 데이터에 대한 응답과 상호 작용이 핵심 기능입니다. 요청마다 CakeRequest는 하나씩 만들어져 요청 데이터를 사용하는 어플리케이션의 다양한 레이어에 참조가 전달됩니다. 기본적으로 CakeRequest 는 $this->request에 설정된 컨트롤러, 뷰 헬퍼에서 사용할 수 있습니다. 또한 컨트롤러의 참조를 사용하여 컴포넌트 안에서도 액세스 할 수 있습니다. CakeRequest 의 역할은 다음과 같습니다. :

  • GET, POST 그리고 FILES 배열을 익숙한 데이터 구조로 변환하는 작업을 수행합니다.
  • 요청 관련 내성적 인 환경을 제공합니다. 전송 된 헤더와 클라이언트의 IP 주소, 서버가 실행되는 하위 도메인/도메인 정보 등이 포함됩니다.
  • 요청 매개 변수에 액세스하는 방법을 인덱싱 된 배열과 객체의 속성이 모두 형식으로 제공합니다.

Request Parameter에 접근

CakeRequest는 요청 파라메터에 액세스하기 위해 몇 가지 인터페이스를 제공합니다. 첫 번째 방법으로는 색인화 된 배열입니다. 두 번째 방법은 $this->request->params를 통해 접근하는 방법입니다. 세번째는 객체의 속성으로 액세스하는 방법입니다. :

$this -> request -> controller;
$this -> request ['controller'];
$this -> request -> params ['controller'];

위는 3가지 모두 같은 값에 액세스 할 수 있습니다. 파라메터에 액세스하는 방법이 여러이기 때문에 기존 어플리케이션에 이식하기 편해질지도 모릅니다. 모든 route-elements는이 인터페이스를 통해 액세스됩니다.

route-elements 이외에 passed-arguments나 named-parameters에 대한 액세스가 종종 필요합니다. 이들은 양쪽 모두 Request 오브젝트와 마찬가지로 사용할 수 있습니다. :

// 전달 된 인수
$this -> request -> pass;
$this -> request [ 'pass'];
$this -> request -> params [ 'pass'];

// 명명 된 매개 변수
$this -> request -> named;
$this -> request ['named'];
$this -> request -> params ['named'];

모든 전달 된 인수와 명명 된 매개 변수에 액세스하는 방법을 제공하고 있습니다. 이 가운데는 CakePHP 내부에서 사용하고있는 중요하고 유용한 변수가 존재며, 또한 Request 파라메터 안에서 모두 찾을 수 있습니다.

  • plugin 요청을 처리하는 플러그인에서 플러그인이없는 경우는 null입니다.
  • controller 현재 요청을 처리하는 컨트롤러입니다.
  • action 현재 요청을 처리하는 작업입니다.
  • prefix 현재 액션 접두사입니다. 자세한 내용은 prefix-routing보세요.
  • bare 요청이 requestAction() 에서 시작 bare 옵션을 포함 할 때 정의됩니다. 원시 요청은 렌더링 된 레이아웃을지지 않습니다.
  • requested 액션이 requestAction() 에서 시작될 때 정의 된 true가 설정됩니다.

쿼리 문자열 파라메터에 접근

쿼리 문자열 매개 변수는 CakeRequest::$query를 사용하여 읽을 수 있습니다. :

// url은 /posts/index?page=1&sort=title
$this -> request -> query ['page'];

// 배열을 통해 액세스 할 수 있습니다
// Note : 하위 호환 액세서입니다.  향후 버전에서는 비추천입니다.
$this -> request [ 'url'] [ 'page'];

$query 속성에 직접 액세스하거나 오류가 발생하지 않는 방법으로 URL 쿼리 배열을 읽기 위하여 CakeRequest::query()를 사용할 수 있습니다. 키가 존재하지 않으면 null이 반환됩니다. :

$foo = $ this -> request -> query ( 'value_that_does_not_exist');
// $ foo === null

POST 데이터에 액세스

모든 POST 데이터는 CakeRequest::$data를 사용하여 접근가능합니다. 양식 데이터가 data접두사를 포함하는 경우, 접두사는 제거 될 것입니다. 예를 들면 :

// name 속성이 'data [Post] [title]'였다 입력은 다음과 같이 사용합니다.
$this -> request -> data ['Post'] ['title'];

$data 속성에 직접 액세스하거나 오류가 발생하지 않는 방법으로 data 배열을 읽기 위해 CakeRequest::data()를 사용할 수 있습니다. 키가 존재하지 않으면 null이 반환됩니다. :

$foo = $this -> request -> data ( 'Value.that.does.not.exist');
//$foo == null

PUT 또는 POST 데이터에 액세스

버전 2.2에서 추가.

REST 서비스를 구축 할 때 PUT 및 DELETE 요청 데이터를 받아 들일경우가 많습니다. 2.2에서 application/x-www-form-urlencoded의 Request Body의 데이터는 PUT과 DELETE 요청에서 자동으로 구문이 해석 되어 $this -> data로 설정됩니다. 만약 JSON과 XML데이터를 받아들이는 경우 어떻게 Request Body에 액세스하면 좋을지에 대해서는 다음의 설명을 확인해 주세요.

XML 또는 JSON 데이터에 액세스

REST 를 사용하는 응용 프로그램에서 URL 인코딩되지 않은 post 형식으로 데이터를 교환하는 경우가 종종 있습니다. CakeRequest::input()을 사용하는 어떤한 형식이라도 입력 데이터를 읽어 들일 수 있습니다. 디코딩 함수가 제공되기때문에 직렬화 된 콘텐츠를 받아들일 수 있습니다. :

// PUT / POST 액션에 게시 된 데이터를 JSON 형식으로 인코딩해서 취득.
$data = $this -> request -> input('json_decode');

json_decode의 ‘as array’매개 변수와 XML을 DOMDocument 객체로 변환하고 싶을 때와 같이 직렬화 메소드에서 호출시 추가 매개 변수가 필요한 것이 있으므로 CakeRequest::input()은 추가 매개 변수를 전달할 수 있도록 되어 있습니다. :

// PUT / POST 액션에 게시 된 데이터를 Xml 인코딩해서 취득.
 $ data = $ this -> request -> input ( 'Xml :: build', array ( 'return'=> 'domdocument'));

경로 정보에 접근

CakeRequest는 어플리케이션의 경로에 대한 유용한 정보를 제공하고 있습니다. CakeRequest::$base 와 CakeRequest: :$webroot 는 URL의 생성과 어플리케이션이 하위 디렉토리에 있는지의 여부를 결정하는 데 도움이됩니다.

요청을 조사

다양한 Request 상태를 감지하기 위해 이전에는 RequestHandlerComponent 를 사용해야했습니다. 이 메소드들은 CakeRequest 로 이동되어 호환성을 유지하면서 새로운 인터페이스를 제공하고 있습니다. 사용법은 다음과 같습니다. :

$this -> request -> is ('post');
$this -> request -> isPost (); // 비추천

양쪽 모두 같은 값을 반환합니다. RequestHandlerComponent 에서 그 방식을 사용할 수있게되었을 때,이 메소드는 폐지되고 최종 릴리스 전에 삭제 될지도 모릅니다. 또한 새로운 종류의 검출기(detector)를 만드는 데 CakeRequest:: addDetector()를 사용해서 Request 검출기를 쉽게 확장 할 수 있습니다. 4종류의 다른 검출기를 만들 수 있습니다. :

  • 환경 변수의 비교 - 환경 변수의 비교, env() 에서 얻은 값과 기존의 값을 비교합니다. 환경 변수는 제공된 값에 대해 동등성을 확인합니다.
  • 패턴 값의 비교 - 패턴 값의 비교에서는 env() 에서 얻은 값과 정규 표현식을 비교합니다.
  • 옵션 기반의 비교 - 옵션 기반의 비교에서는 정규식을 만들기 위해 옵션의 목록을 사용합니다. 이미 정의 된 옵션 검출기를 추가하기 위해 호출 옵션을 병합하는 것입니다.
  • 콜백 검출기 - 콜백 검출기는 체크를 처리하기 위해 ‘callback’유형을 제공합니다. 콜백은 파라메터로서만 요청 객체를 받습니다.

다음은 몇 가지 예를 보여줍니다. :

environment detector 추가
$this -> request -> addDetector (
     'post',
     array ( 'env'=> 'REQUEST_METHOD', 'value'=> 'POST')
);

// pattern value detector 추가
$this -> request -> addDetector (
     'iphone',
     array ( 'env'=> 'HTTP_USER_AGENT', 'pattern'=> '/ iPhone / i')
);

// option detector 추가
$this -> request -> addDetector ( 'internalIp', array (
    'env'=> 'CLIENT_IP',
    'options'=> array ( '192.168.0.101', '192.168.0.100')
));

// callback detector를 추가한다.  익명 함수 또는 정규 콜백이 지정 가능.
$this -> request -> addDetector (
    'awesome',
    array ( 'callback'=> function ($ request) {
       return isset ($ request -> awesome);
    })
);

CakeRequest 에는 CakeRequest::domain() ,CakeRequest::subdomains() 과 CakeRequest::host() 와 같은 하위 도메인을 처리 할수 있도록 해주는 함수가 있기 때문에 좀 더 쉽게 할 수 있습니다.

사용 가능한 내장 검출기는 다음과 같습니다. :

  • is(‘get’) 현재 리퀘스트가 GET 여부를 확인합니다.
  • is(‘put’) 현재 리퀘스트가 PUT 여부를 확인합니다.
  • is(‘post’) 현재 리퀘스트가 POST 여부를 확인합니다.
  • is(‘delete’) 현재의 리퀘스트가 DELETE에 있는지 여부를 확인합니다.
  • is(‘head’) 현재 리퀘스트가 HEAD 여부를 확인합니다.
  • is(‘options’) 현재 리퀘스트가 OPTIONS 여부를 확인합니다.
  • is(‘ajax’) 현재 리퀘스트가 X-Requested-With = XMLHttpRequest에서 파생 된 것인지를 확인합니다.
  • is(‘ssl’) 리퀘스트가 SSL을 통해 여부를 확인합니다.
  • is(‘flash’) 리퀘스트에 Flash의 User-Agent가 있는지 확인합니다.
  • is(‘mobile’) 리퀘스트에 모바일 에이전트의 공통 목록에 유래하고 있는지 여부를 확인합니다.

CakeRequest과 RequestHandlerComponent

CakeRequest가 제공하는 많은 기능은 이전 RequestHandlerComponent 속에 있었으므로, CakePHP2.0에 어떻게 들어가는지를 이해하기 위해 재고해야할 필요가 있습니다. 2.0에서 RequestHandlerComponent는 후원자(sugar daddy)에 해당합니다. CakeRequest가 제공하는 유틸리티 맨 위에 sugar 레이어를 제공하고 있습니다. 레이아웃 전환이나 콘텐츠 형식과 ajax를 바탕으로 한 뷰 등 sugar는 RequestHandlerComponent영역입니다. 유틸리티와 sugar 클래스를 분리함으로써 원하는 것들의 취사선택이 쉽게 될 것입니다.

요청의 다른 요소와 상호 작용

CakeRequest는 요청에 대한 다양한 것을 내관(introspect)하는 데 사용할 수 있습니다. 또한 검출기 따라 다양한 속성과 메소드에서 다른 정보를 찾을 수 있습니다.

  • $this-> request-> webroot는 webroot 디렉토리를 포함합니다.
  • $this-> request-> base는 기본 경로를 포함합니다.
  • $this-> request-> here 현재 요청에 완전한 주소를 포함합니다.
  • $this-> request-> query는 쿼리 문자열 매개 변수를 포함합니다.

CakeRequest API

class CakeRequest

CakeRequest는 요청 파라미터의 처리를 캡슐화하고 내관 할 수 있습니다.

CakeRequest::domain($tldLength = 1)

응용 프로그램이 실행되는 도메인 이름을 반환합니다.

CakeRequest::subdomains($tldLength = 1)

응용 프로그램이 실행되는 하위 도메인을 배열로 돌려줍니다.

CakeRequest::host()

응용 프로그램의 호스트 이름을 반환합니다.

CakeRequest::method()

요청의 HTTP 메소드를 반환합니다.

CakeRequest::onlyAllow($methods)

허용 된 HTTP 메소드를 설정합니다. 만약 일치하지 않으면 MethodNotAllowedException을 던집니다. 405 응답은 통과 할 수있는 방법을 가지고 Allow 헤더가 포함됩니다.

버전 2.3에서 추가.

2.5 버전 철폐 : 대신 CakeRequest::allowMethod() 를 사용하십시오.

CakeRequest::allowMethod($methods)

허용 된 HTTP 메소드를 설정합니다. 만약 일치하지 않으면 MethodNotAllowedException을 던집니다. 405 응답은 통과 할 수있는 방법을 가지고 Allow 헤더가 포함됩니다.

버전 2.5에서 추가.

CakeRequest::referer ($local = false)

요청의 리퍼러를 반환합니다.

CakeRequest::clientIp ($safe = true)

현재 액세스하는 클라이언트의 IP 주소를 반환합니다.

CakeRequest::header ($name)

요청에 사용되는 HTTP_ * 헤더에 액세스 할 수 있습니다. :

$ this -> request -> header ( 'User-Agent');

이 경우 요청에 사용되는 사용자 에이전트가 반환됩니다.

CakeRequest::input ($callback [$options])

요청 및 디코딩 함수를 통해 전달 된 input 데이터를 가져옵니다. 요청 본문을 XML이나 JSON으로 교환 할 때 유용합니다. 디코딩 함수의 추가 매개 변수는 input()의 인수로 전달할 수 있습니다. :

$this -> request -> input ( 'json_decode');

CakeRequest::data($key)

요청 데이터에 닷 기법에 의한 액세스를 제공합니다. 요청 데이터 읽기 및 변경이 가능합니다. 또한 다음과 같이 연쇄 적으로 호출을 할 수 있습니다. :

 // 요청 데이터를 수정하고 양식 필드를 생성 할 수 있습니다.
 $ this -> request -> data ('Post.title', 'New post')
     -> data ( 'Comment.1.author', 'Mark');

 // 데이터 검색도 할 수 있습니다.
 $ value = $ this -> request -> data ( 'Post.title');

CakeRequest::is ($check)

요청이 기준에 적합한 지 여부를 확인합니다. CakeRequest::addDetector() 에 추가 된 추가 규칙뿐만 아니라 내장의 검색 규칙을 사용할 수 있습니다.

CakeRequest::addDetector ($name, $callback)

CakeRequest::is() 와 함께 사용되는 검출기를 추가합니다. 자세한 내용은 요청을 검사 를 참조하십시오.

CakeRequest::accepts ($type = null)

클라이언트가 어떤 콘텐츠 유형을 허용 할 지 확인합니다. 또한 특정 콘텐츠 유형이 허용되는지 여부를 확인합니다.

모든 유형 가져 오기 :

$ this -> request -> accepts ();

특정 유형에 대해 알아 :

$ this -> request -> accepts ( 'application / json');

static CakeRequest::acceptLanguage ($language = null)

클라이언트에 의해 접수되는 모든 언어를 가져옵니다. 또한 특정 언어가 접수 여부를 확인합니다.

접수되는 언어 목록을 검색 :

CakeRequest :: acceptLanguage ();

특정 언어가 접수되는지 여부를 확인 :

CakeRequest :: acceptLanguage ( 'es-es');

CakeRequest::param ($name)

$request-> params 값을 안전하게 읽습니다. 매개 변수의 값을 사용하기 전에 isset () 또는 empty ()를 호출 할 필요가 없습니다.

버전 2.4에서 추가.

property CakeRequest::$data

POST 데이터의 배열입니다. CakeRequest::data() 를 사용하면 오류가 발생하지 않도록하면서 속성을 가져올 수 있습니다.

property CakeRequest::$query

쿼리 문자열 매개 변수의 배열입니다.

property CakeRequest::$params

루트 요소와 요청 파라미터의 배열입니다.

property CakeRequest::$Here

현재 요청의 uri를 반환합니다.

property CakeRequest::$base

응용 프로그램에 대한 기본 경로입니다. 응용 프로그램이 하위 디렉토리에 배치되지 않는 한, 보통은 /입니다.

property CakeRequest::$Webroot

현재의 webroot 입니다

'PHP' 카테고리의 다른 글

[CakePHP] Controller - Components  (0) 2015.05.08
[CakePHP] Controller - PageController  (0) 2015.05.08
[CakePHP] Controller - Scaffolding  (0) 2015.05.08
[CakePHP] CakeResponse  (0) 2015.05.07
cakePhp- controller  (0) 2015.05.06
Posted by dewnine
,