[CakePHP] CakeResponse

PHP 2015. 5. 7. 19:48

CakeResponse

CakeResponse 는 CakePHP의 기본 응답 클래스입니다. 일부 기능과 HTTP 응답의 생성을 캡슐화합니다. 또한 전송 예정 헤더를 조사하기 위해 모의와 스텁으로 테스트 할 수있게합니다. CakeRequest 처럼 CakeResponse 은 Controller 와 RequestHandlerComponent 및 Dispatcher에 이전부터있는 많은 방법을 강화합니다. 오래된 메소드는 폐지되고 CakeResponse 의 사용이 권장됩니다.

CakeResponse 는 다음과 같은 일반적인 응답을 포장하기위한 인터페이스를 제공합니다. :

  • 리디렉션을 위해 헤더를 보내는 것.
  • 컨텐츠 유형 헤더를 보내는 것.
  • 헤더를 보내는 것.
  • 응답 본문을 보내는 것.

Response 클래스 변경하기

CakePHP는 기본적으로 CakeResponse 을 사용합니다. CakeResponse 는 유연하고 투명하게 클래스가 사용됩니다. 그러나이 클래스를 응용 프로그램 고유의 클래스로 대체해야하는 경우 CakeResponse 을 무시하고 자신의 클래스로 대체 할 수 있습니다. 그것은 app / webroot / index.php에서 CakeResponse 을 대체하여 제공합니다.

이 대체 의해 모든 컨트롤러가 CakeResponse 대신 CustomResponse을 사용할 수있게됩니다. 또한 컨트롤러에서 $this-> response로 설정하여 응답 인스턴스를 대체 할 수 있습니다. 응답 개체의 재정은 header() 와 상호 작용하는 방법을 스텁 화 쉽게하기 때문에 테스트에서 사용하기 쉽습니다. 자세한 내용은 CakeResponse 및 테스트 를 참조하십시오.

콘텐츠 형식을 취급

CakeResponse::type()을 사용함으로써 어플리케이션 응답의 Content-Type을 제어 할 수 있습니다. 만약 CakeResponse에 포함되지 않은 콘텐츠 유형을 처리해야하는 경우는 다음과 같이 CakeResponse::type()을 사용하여 설정할 수 있습니다.

  // vCard 유형을 추가
 $this -> response -> type(array('vcf'=> 'text / v-card'));

 // 응답의 Content-Type을 card로 설정
 $this -> response -> type('vcf');

대부분의 경우, 추가 콘텐츠 형식은 컨트롤러의 beforeFilter()의 콜백 내에서 설정하고 싶어하기 때문에 RequestHandlerComponent가 제공하는 뷰의 자동 전환 기능을 활용할 수 있습니다.

파일 쓰기

요청에 대한 응답으로 파일을 보내고 싶은 경우가 있습니다. 버전 2.3 이전에는 MediaView를 사용할 수있었습니다. 2.3 이상에서 MediaView 는 비추천되며 CakeResponse::file()을 사용하여 파일을 전송합니다. :

  public function sendFile($id){
     $file = $this -> Attachment -> getFile($id);
     this -> response -> file($file ['path']);
     // Response 객체를 반환하면 컨트롤러가 뷰의 렌더링을 중단합니다
     return $this -> response;
 }

위의 예제처럼 메소드에 파일의 경로를 전달해야합니다. CakePHP는 CakeResponse::$_mimeTypes에 등록 된 잘 알려진 파일 형식이면 올바른 컨텐츠 유형 헤더를 보냅니다. CakeResponse::file()을 부르기 전에 CakeResponse::type() 메소드를 사용하여 새로운 유형을 추가 할 수 있습니다.

만약 당신이 원한다면 옵션을 명기하여 브라우저에 표시하는 대신 파일을 다운로드 하도록 할 수 있습니다. :

$this -> response -> file(
    $file['path']
    array('download'=> true 'name'=> 'foo')
);

문자열을 파일로 쓰기(다운로드)

동적으로 생성 된 pdf 나 ics처럼 디스크에 존재하지 않는 파일을 반환 할 수 있습니다. :

  public function sendIcs(){
     $icsString = $this -> Calendar -> generateIcs();
     $this -> response -> body($icsString);
     $this -> response -> type('ics');

     // 임의의 다운로드 파일 이름을 지정할 수 있습니다
     $this -> response -> download('filename_for_download.ics');

     // 응답 객체를 반환하면 컨트롤러가 뷰의 렌더링을 중단합니다
     return $this -> response;
 }

헤더를 설정

헤더의 설정은 CakeResponse::header()에서 이루어집니다. 이 메서드는 조금 다른 파라미터 설정과 함께 불립니다. :

 // 헤더를 하나 설정
 $this -> response -> header('Location', 'http://example.com');

 // 여러 헤더를 설정
 $this -> response -> header( array(
     'Location'=> 'http://example.com'
     'X-Extra'=> 'My header'
 ));
 $this -> response -> header( array(
     'WWW-Authenticate::Negotiate'
     'Content-type::application / pdf'
 ));

같은 헤더를 여러 번 설정하면 보통 header 호출과 같이 이전 값을 덮어 쓰게 됩니다. CakeResponse::header() 가 호출되지 않으면 헤더는 전송되지 않습니다. 이 헤더는 응답이 실제로 보내질 때까지 버퍼링됩니다.

버전 2.4에서 추가.

CakeResponse::location() 를 사용하면 직접 리디렉션 헤더의 설정 및 복원이 가능합니다.

브라우저 캐시와 상호 작용

때때로 컨트롤러 액션의 결과를 캐시하지 않도록 브라우저를 설정 해야 할 경우 있습니다. CakeResponse::disableCache()는 이러한 목적으로 사용됩니다. :

  public function index(){
     // do something.
     $this -> response -> disableCache();
 }

경고
Internet Explorer에 파일을 보내려고하는 경우 SSL 도메인에서의 다운로드와 함께 disableCache()를 사용하는 것을 오류로 할 수 있습니다.

또한 CakeResponse::cache() 를 사용하여 클라이언트에 응답을 캐시 하도록 할 수 있습니다. :

  public function index(){
     // do something
     $this -> response -> cache('-1 minute', '+5 days');
 }

위의 예에서는 방문자의 체감 속도 향상을 위해 클라이언트에 응답 결과를 5일 캐시하도록 전하고 있습니다. CakeResponse::cache() 는 첫 번째 인수에 Last-Modified 헤더 값을 설정합니다. 두 번째 인수에 Expires 헤더 값과 max-age 지시어 값을 설정합니다. Cache-Control의 public 지시어도 설정됩니다.

HTTP 캐시를 튜닝

응용 프로그램의 속도를 개선하기위한 간단하고 좋은 방법 중 하나는 HTTP 캐시를 사용하는 것입니다. 이 캐시 모델은 원래 modified time, response entity tag 등 일부 헤더를 설정하여 응답의 캐시 된 복사본을 사용할지 여부를 클라이언트가 결정하도록 도울 수 있어야합니다.

캐시와 데이터가 변경 될 때 비활성화(업데이트)하는 로직 코드를 가지는 것이 아니라, HTTP는 두 모델 expiration과 validation을 사용합니다. 이들은 대부분의 경우 자신의 캐시를 관리하는 것보다 상당히 간단합니다.

CakeResponse::cache() 와 독립하여 HTTP 캐시 헤더를 튜닝하기위한 다양한 방법을 사용할 수 있습니다. 이 점에 관해서 브라우저 또는 리버스 프록시 캐시보다 유리하다고 할 수 있습니다.

Cache Control 헤더

버전 2.1에서 추가.

캐시 제어 헤더는 expiration 모델 하에서 사용되며, 여러 지침이 포함되어 있습니다. 브라우저와 프록시가 어떻게 캐시 된 콘텐츠를 취급할지를 지시, 변경할 수 있습니다. Cache-Control 헤더는 다음과 같습니다. :

Cache-Control: private, max-age = 3600, must-revalidate

CakeResponse 의 일부 유틸리티 메소드를 이용함으로써 최종적으로 유효한 Cache-Control 헤더를 생성합니다. 첫째는 CakeResponse::sharable() 메소드입니다. 이 방법은 다른 사용자와 클라이언트간에 공유 할 수있는 것을 고려한 응답인지의 여부를 나타냅니다. 이 메소드는 실제로는 이 헤더가 public 또는 private의 어느 쪽인가를 제어 할 수 있습니다. private에 응답을 설정하는 것은 응답의 전체 또는 일부가 특정 사용자용임을 보여줍니다. 공유 캐시의 장점을 살리기 위해서는 제어 지시문을 public으로 설정해야합니다.

이 메서드의 두 번째 매개 변수는 캐시의 max-age를 지정하는 데 사용됩니다. 이 매개 변수는 응답이 이전 버전으로 보이도록 초를 표시합니다. :

  public function view(){
     ...
     // Cache-Control을 3600 초 동안 public으로 설정
     $this -> response -> sharable(true, 3600);
 }

 public function my_data(){
     ...
     // Cache-Control을 3600 초 동안 private로 설정
     $this -> response -> sharable(false, 3600);
 }

CakeResponse 는 Cache-Control 헤더에서 각 구성 요소를 설정하기 위해 분할 된 메소드를 공개하고 있습니다.

Expiration 헤더

버전 2.1에서 추가.

Expires 헤더에 응답이 오래된 것으로 간주되도록 시간을 설정할 수 있습니다. 이 헤더는 CakeResponse::expires() 메소드를 사용하여 설정됩니다. :

  public function view(){
     $this -> response -> expires('+ 5 days');
 }

또한이 방법은 DateTime 인스턴스와 DateTime 클래스에 의해 구문 분석 가능한 문자열을 받아들입니다.

Etag 헤더

버전 2.1에서 추가.

HTTP의 캐시 검증은 콘텐츠가 정기적으로 변화하는 경우에 사용되며, 오래된 캐쉬로 보여질 경우에만 응답 콘텐츠가 생성되는 것을 어플리케이션에게 요구합니다. 이 모델 하에서 클라이언트는 페이지를 직접 사용하는 대신 캐시에 저장하여 계속 어플리케이션에 매번 리소스가 변경되었는지 여부를 묻습니다. 이것은 이미지 및 기타 어셋 등의 정적 리소스에 사용되는 경우가 많습니다.

etab() 메소드(entity tag라고도 함)은 요구 된 자원을 식별하는 고유 한 문자열입니다. 대부분의 경우 파일의 체크섬과 같은 것으로, 자원이 일치하는지 여부를 확인하기 위해 캐시는 체크섬을 비교하는 것입니다.

실제로이 헤더를 사용할 때의 이점을 얻기 위해 수동으로 CakeResponse::checkNotModified() 메서드를 호출하거나 컨트롤러에 RequestHandlerComponent 을로드해야합니다. :

  public function index(){
     $articles = $this -> Article -> find('all');
     $this -> response -> etag($this -> Article -> generateHash($articles));
     if($this -> response -> checkNotModified($this -> request)){
         return $this -> response;
     }
     ...
 }

Last Modified 헤더

버전 2.1에서 추가.

HTTP 캐시의 validation 모델 하에서는 자원이 마지막으로 수정 된 날짜와 시간을 나타 내기 위해 Last-Modified 헤더를 설정할 수 있습니다. 이 헤더를 설정하면 CakePHP가 캐시하고 있는 클라이언트에 응답이 변경된 것인지 여부를 대답하는 데 도움이됩니다.

실제로이 헤더를 사용할 때의 이점을 얻기 위해서는 CakeResponse::checkNotModified() 메서드를 호출하거나 컨트롤러에 RequestHandlerComponent를 로드해야합니다. :

  public function view(){
     $article = $this -> Article -> find('first');
     $this -> response -> modified($article['Article']['modified']);
     if($this -> response -> checkNotModified($this -> request)){
         return $this -> response;
     }
     ...
 }

Vary 헤더

때로는 같은 URL로 다양한 내용을 제공하고 싶을지도 모릅니다. 이에 해당하는 경우는 다국어 지원 페이지가 있거나 브라우저마다 다른 HTML을 반환하는 경우 종종 발생합니다. 그런 상황에서 Vary 헤더를 사용할 수 있습니다. :

$this  ->  response  ->  vary ( 'User-Agent'  );
$this  ->  response  ->  vary ( 'Accept-Encoding', 'User-Agent');
$this  ->  response  ->  vary ( 'Accept- Language'  );

CakeResponse 및 테스트

컨트롤러와 컴포넌트의 테스트가 간단하게 가능했을 때 CakeResponse 를 사용하고있어 좋았다고 생각할지도 모릅니다. 여러 개체를 횡단하여 사용하는 메소드 대신 컨트롤러와 구성 요소가 CakeResponse 에 위임하고있는 것을 모방(mock)객체를 준비하기만하면 됩니다. 이 것으로 ‘단위’테스트를 만들기 쉬워지고 컨트롤러 테스트 실행이 쉬워집니다. :

 public function  testSomething (){ 
    $this  ->  controller  ->  response  =  $this  ->  getMock ( 'CakeResponse'  ); 
    $this  ->  controller  ->  response  ->  expects ( $this  ->  once ())  ->  method ( 'header'  );
     // ...
 }

또한 CLI에서 헤더 설정을 시도 할 때 일어나는 ‘헤더 보내기’오류를 피하기 위해 모의를 사용할 수 있기 때문에 명령 줄에서 더 쉽게 테스트를 실행할 수 있습니다.

CakeResponse API

class CakeResponse

CakeResponse는 클라이언트에 보내는 응답과 상호 작용에 도움이 되는 메소드를 많이 제공합니다.

CakeResponse::header($header = null , $value = null )

응답과 함께 전송되는 하나 이상의 헤더를 직접 설정할 수 있습니다.

CakeResponse::location($url = null )

응답과 함께 보내진다 리디렉션 헤더를 직접 설정할 수 있습니다. :

// Set the redirect location 
$this  ->  response  ->  location ( 'http://example.com'  );

// Get the current redirect location header 
$location  =  $this  ->  response  ->  location ();

버전 2.4에서 추가.

CakeResponse::charset($charset = null )

응답에서 사용되는 문자 코드의 종류를 설정합니다.

CakeResponse::type($contentType = null )

응답 콘텐츠 형식을 설정합니다. 알려진 콘텐츠 형식의 별명 또는 콘텐츠 형식의 정식 명칭을 사용할 수 있습니다.

CakeResponse::cache($since , $time = ‘+1 day’ )

응답 캐시 헤더를 설정할 수 있습니다.

CakeResponse::disableCache()

응답 클라이언트의 캐시를 비활성화하는 헤더를 설정합니다.

CakeResponse::sharable($public = null , $time = null )

Cache-Control 헤더에 public 또는 private 를 설정하고 선택적으로 자원의 max-age 지시자를 설정합니다.

버전 2.1에서 추가.

CakeResponse::expires($time = null )

Expires 헤더에 특정 날짜를 설정할 수 있습니다.

버전 2.1에서 추가.

CakeResponse::etag($tag = null , $weak = false )

응답 자원을 고유하게 식별하는 Etag 헤더를 설정합니다.

버전 2.1에서 추가.

CakeResponse::modified($time = null )

Last-Modified 헤더에 특정 날짜를 올바른 형식으로 설정합니다.

버전 2.1에서 추가.

CakeResponse::checkNotModified(CakeRequest $request )

요청 객체 및 응답의 캐시 헤더를 비교하고 아직 캐시를 사용할 수 있는지 여부를 결정합니다. 만약 아직 유효한 경우 응답 내용은 삭제 된 304 Not Modified 헤더가 보내집니다.

버전 2.1에서 추가.

CakeResponse::compress()

응답 gzip 압축을 사용 시작합니다.

CakeResponse::download($filename )

첨부 파일로 응답을 보내 파일 이름을 설정할 수 있습니다.

CakeResponse::statusCode($code = null )

응답 상태 코드를 설정할 수 있습니다.

CakeResponse::body($content = null )

응답의 콘텐츠 몸을 설정합니다.

CakeResponse::send()

응답의 작성이 완료된 후 send()를 호출하는 것으로 Body와 같이 설정되어있는 모든 헤더가 보내집니다. 각 요청의 마지막에 Dispatcher 에 의해 자동으로 이루어집니다.

CakeResponse::file($path , $options = array() )

보기 또는 다운로드하는 파일의 Content-Disposition 헤더를 설정할 수 있습니다.

버전 2.3에서 추가.

'PHP' 카테고리의 다른 글

[CakePHP] Controller - Components  (0) 2015.05.08
[CakePHP] Controller - PageController  (0) 2015.05.08
[CakePHP] Controller - Scaffolding  (0) 2015.05.08
[CakePHP] CakeRequest 요청 객체  (0) 2015.05.07
cakePhp- controller  (0) 2015.05.06
Posted by dewnine
,