PHP : ini_set() 함수

PHP 2015. 5. 19. 19:55

PHP - ini_set();

php의 설정하기 위한 함수입니다.
php의 설정 확인은 웹페이지의 경우 는 xxx.php 파일 에서는 <?php phpinfo(); ?>를 작정하여 브라우저에서 확인이 가능하며, 커맨트라인에서는 php -i 을 실행하면 현재 php의 설정 내용을 확인 할 수 있습니다.

설정을 변경하기 위해서는 위의 설정 확인에서 표시되는 Loaded Configuration File 의 php.ini를 수정하여 변경이 가능합니다.

이것은 공통 설정이며 호스팅업체에서 제공하는 서비스이용시나 일시적, 혹은 동적으로 변경하기 위해서는 ini_set(); 함수를 이용합니다.

string ini_set ( string $varname , string $newvalue )
$varname

설정 변수의 이름

$newvalue

설정을 변경할 새로운 값

예제

error의 표시 여부를 조절할 경우

ini_set('display_errors', 1);

이 함수가 호출 되었을 경우만 설정이 변경되어 적용됩니다. 이함수가 호출된 페이지를 포함할 경우만 일시적으로 변경이 적용되며 함수가 호출 되지 않았을 경우에는 php.ini 파일의 설정이 적용됩니다.

'PHP' 카테고리의 다른 글

CakePHP- View - Helper  (0) 2015.05.14
CakePHP - View - Json 과 XML 뷰  (0) 2015.05.13
CakePHP - 뷰 - 테마  (0) 2015.05.13
CakePHP - View  (0) 2015.05.12
[CakePHP] Controller - Components  (0) 2015.05.08
Posted by dewnine
,

CakePHP- View - Helper

PHP 2015. 5. 14. 15:48

헬퍼

헬퍼는 프리젠 테이션 레이어를위한 구성 요소와 같은 클래스입니다. 많은 뷰나 엘리먼트, 레이아웃에서 공유되는 표시 로직을 포함하고 있습니다. 이 장에서는 헬퍼를 만드는 방법과 CakePHP의 핵심 헬퍼에있는 기본적인 작업의 개요를 설명합니다.

CakePHP는 뷰의 생성에 도움이되는 몇 가지 특징적인 헬퍼가 있습니다. 그들은 올바른 형식의 마크업(양식 포함), 텍스트, 시간, 숫자 모양에 도움이 되거나, Ajax 기능을 한층 빠르게 하기도합니다. CakePHP 헬퍼에 대한 자세한 정보는 코어 라이브러리의 헬퍼를 참조.

헬퍼 설정 및 사용

CakePHP에서 헬퍼를 사용하려면 컨트롤러에 인식시킬 필요가 있습니다. 각 컨트롤러는 $helpers 속성을 가지고 있으며, 그 속성은 뷰에서 사용할 수있는 헬퍼 목록을 유지하고 있습니다. 뷰에서 헬퍼를 사용하려면 헬퍼의 이름을 컨트롤러의 $helpers 배열에 추가하십시오. :

  class BakeriesController extends AppController {
     public $helpers = array ( 'Form', 'Html', 'Js', 'Time');
 }

플러그인에서 헬퍼를 추가하려면 CakePHP의 다양한 장소에서 사용되고있는 DebugKit.Toolbar의 표기법과 같은 플러그인 기법을 사용합니다. :

  class BakeriesController extends AppController {
     public $helpers = array ( 'Blog.Comment');
 }

어떤 액션 동안만 헬퍼를 추가 할 수 있습니다. 즉, 어떤 헬퍼의 이용을 특정 컨트롤러 액션에 한정하여 동일한 컨트롤러의 다른 액션에서는 사용할 수 없도록 할 수 있습니다. 이것은 컨트롤러가 정리 된 상태를 유지하는 데 도움이 될뿐만 아니라 또한 헬퍼를 사용하지 않는 다른 액션의 처리 비용을 절약 할 수 있습니다. :

  class BakeriesController extends AppController {
     public function bake () {
         $this->helpers[] = 'Time';
     }
     public function mix () {
         // 여기에 Time 헬퍼는로드되지 않기 때문에 사용할 수 없습니다
     }
 }

만약 모든 컨트롤러에서 헬퍼를 활성화 할 필요가있는 경우 헬퍼 이름을 /app/Controller/AppController.php (없는 경우 작성하십시오)의 $helpers 배열에 추가하십시오. 기본 Html 헬퍼와 Form 헬퍼도 잊지 말고 읽어주세요. :

  class AppController extends Controller {
     public $helpers = array('Form', 'Html', 'Js', 'Time');
 }

헬퍼는 옵션을 전달할 수 있습니다. 이 옵션은 속성 값을 설정하거나 헬퍼의 동작을 바꾸기 위하여 사용할 수 있습니다. :

  class AwesomeHelper extends AppHelper {
     public function __construct(View $view, $settings = array()) {
         parent::__construct ($view $settings);
         debug ($settings);
     }
 }

 class AwesomeController extends AppController {
     public $helpers = array('Awesome'=> array ( 'option1'=> 'value1'));
 }

모든 헬퍼 공통적으로 사용할 수있는 설정에 className 옵션이 있습니다. 이 옵션을 설정하면 뷰에 별칭의 헬퍼를 만들 수 있습니다. 이 기능은 $this->Html 및 기타 공통 헬퍼 참조를 자체 구현으로 대체 할 때 유용합니다. :

  // app/Controller/PostsController.php
 class PostsController extends AppController {
     public $helpers = array (
         'Html'=> array (
             'className'=> 'MyHtml'
         )
     );
 }

 // app/View/Helper/MyHtmlHelper.php
 App::uses ( 'HtmlHelper', 'View/Helper');
 class MyHtmlHelper extends HtmlHelper {
     // 코어 HtmlHelper를 무시하도록 코드를 추가하십시오
 }

위의 예에서는 뷰에서 MyHtmlHelper가 $this->Html 별칭이 되어있습니다.

별칭이 붙은 헬퍼는 어디에서 사용되고 있었다고 해도 그 인스턴스를 대체합니다. 그것에는 다른 헬퍼 내부도 포함되어 있습니다.

 

Html이나 Session의 별칭을 붙인 헬퍼는 코어 PagesController에서 사용하면 잘 움직이지 않을 것입니다. 따라서 lib/Cake/Controller/PagesController.phpapp/Controller/폴더에 복사하는 것이 좋습니다.

헬퍼를 설정하여 선언적으로 헬퍼를 설정할 수 있게되었고 또한 컨트롤러 액션 밖으로 설정 로직을 둘 수 있습니다. 만약 클래스 선언의 일부에 포함 할 수없는 설정 항목이있는 경우 컨트롤러 beforeRender 콜백에서 그들을 설정할 수 있습니다. :

  class PostsController extends AppController {
     public function beforeRender () {
         parent::beforeRender ();
         $this->helpers['CustomStuff'] = $this ->_getCustomStuffSettings ();
     }
 }

헬퍼를 사용

컨트롤러에서 어떤 헬퍼가 사용하고 싶은지를 한번 설정하고 나면 각 헬퍼 뷰에서 공용 속성처럼 처리 할 수있습니다. 예를 들어 HtmlHelper 를 사용하고 있다고합니다. 이 경우 다음과 같이 헬퍼에 액세스 할 수 있습니다. :

  echo $this->Html->css('styles');

위의 예에서는 HtmlHelper의 css 메서드를 호출합니다. 로드 된 헬퍼이면 $this ->{$helperName}의 형식으로 액세스 할 수 있습니다. 뷰 내에서 동적으로 헬퍼를 로드 할 필요를 느낄때가 올지도 모릅다. 그때는 뷰의 HelperCollection를 사용하여 이렇게 할 수 있습니다. :

  $mediaHelper = $this->Helpers->load('Media', $mediaSettings);

HelperCollection는 컬렉션 이며, CakePHP의 다른 부분에서도 사용되고있는 컬렉션 API를 지원하고 있습니다.

콜백 메소드

헬퍼 뷰의 렌더링 공정을 늘리는 것 같은 몇 가지 콜백을 특징으로하고 있습니다. 더 많은 정보를 원한다면, 헬퍼 API 와 컬렉션 문서를 참조하십시오.

헬퍼를 만들기

만약 코어 헬퍼 (또는 GitHub와 Bakery에있는 헬퍼)에서 원하는 것을 할 수 없다고해도 헬퍼를 만드는 것은 간단하기 때문에 괜찮습니다.

여기에서 응용 프로그램의 다양한 장소에서 필요로하는 CSS 스타일 링크를 출력하는 헬퍼를 만들고 싶었다고하자. CakePHP의 기존 헬퍼 구조 논리를 맞추기 위해서는/app/View/Helper에 새로운 클래스를 작성해야합니다. 앞으로 만들 헬퍼 LinkHelper라고 부르기로하자. 실제 PHP 클래스 파일이 될 것입니다. :

 /* /app/View/Helper/LinkHelper.php * /
 App::uses('AppHelper', 'View/Helper');

 class LinkHelper extends AppHelper {
     public function makeEdit ($title, $url) {
         // 특별히 성형된 링크를 만들기위한 로직은 여기 ...
     }
 }

헬퍼 AppHelper 또는 Helper 를 상속하거나 헬퍼 API 에 정의 된 모든 콜백을 구현해야합니다.

다른 헬퍼를로드

다른 헬퍼에 이미 존재하는 기능을 사용하고 싶을지도 모릅니다. 이 경우 $helpers 배열에 사용하고 싶은 헬퍼를 명시하여 제공합니다. 형식은 컨트롤러에서 지정하는 것과 같이하십시오. :

 /* /app/View/Helper/LinkHelper.php (다른 헬퍼를 사용하는) * /
 App::uses ( 'AppHelper', 'View/Helper');

 class LinkHelper extends AppHelper {
     public $helpers = array ( 'Html');

     public function makeEdit ($title, $url) {
         // 성형 된 데이터를 출력하기 위해
         // HTML 헬퍼를 사용 :

         $link = $this->Html->link($title, $url, array ('class'=> 'edit'));

         return '<div class = "editOuter">' . $link . '</ div>';
     }
 }

자작한 헬퍼 사용

일단 헬퍼를 만들어 /app/View/Helper/ 에 배치하면 컨트롤러에서 $helpers 라는 특별한 변수를 사용하는 것으로 그 헬퍼를 로드 할 수 있습니다. :

  class PostsController extends AppController {
     public $helpers = array('Link');
 }

일단 컨트롤러가 이 새로운 클래스를 인식하면 헬퍼의 이름을 따서 명명 된 개체에 액세스하는 것으로, 보기 중에서이 헬퍼를 사용할 수있게합니다. :

 <! - 새로운 헬퍼를 사용하여 링크 만들기 ->
 <? php echo $this->Link->makeEdit ( 'Change this Recipe', '/ recipes/edit/5');?>

모든 헬퍼를위한 기능을 만들기

모든 헬퍼는 특별한 클래스 AppHelper를(모델이 AppModel을 상속 컨트롤러가 AppController를 상속하는 것과 같이) 상속합니다. 모든 헬퍼에서 사용할 수있는 기능을 만들려면 /app/View/Helper/AppHelper.php를 작성하십시오. :

 App::uses ( 'Helper', 'View');

 class AppHelper extends Helper {
     public function customMethod () {
     }
 }

헬퍼 API

class Helper

헬퍼의 base class입니다. 일부 유틸리티 메소드와 다른 헬퍼의로드 기능을 제공합니다.

Helper::webroot($file)

파일 이름을 애플리케이션의 webroot에서 해결합니다. 테마가 활성화되어 현재 테마의 webroot에 파일이 존재하는 경우, 테마 파일의 경로가 반환됩니다.

Helper::url($url, $full = false)

HTML이 이스케이프 된 URL을 생성하고 Router::url()에게 위임합니다.

Helper::value($options = array(), $field = null, $key = ‘value’)

주어진 input 이름에 해당하는 값을 가져옵니다.

Helper::domId($options = null, $id = ‘id’)

현재 선택되어있는 필드에 해당하는 카멜 케이스의 id 값을 생성합니다. AppHelper에서 이 메소드를 덮어 써서 CakePHP가 ID 속성을 생성하는 방법을 변경할 수 있습니다.

콜백

Helper::beforeRenderFile($viewFile)

각 뷰 파일이 렌더링되기 전에 호출됩니다. 여기에는 요소 뷰 상위 뷰 레이아웃을 포함합니다.

Helper::afterRenderFile($viewFile $content)

각 뷰 파일이 렌더링 된 후에 호출됩니다. 여기에는 엘리먼트, 뷰, 상위 뷰, 레이아웃을 포함합니다. 콜백은 렌더링 된 콘텐츠가 브라우저에 어떻게 렌더링되는지를 바꾸기 위하여 $content를 변경하여 반환 할 수 있습니다.

Helper::beforeRender($viewFile)

beforeRender 메서드는 컨트롤러 beforeRender 메소드의 호출후에 호출됩니다. 그렇지만 컨트롤러가 뷰와 레이아웃을 그리기 전 입니다. 렌더링되는 파일을 인수로 사용합니다.

Helper::afterRender($viewFile)

뷰가 렌더링 된 후에 호출됩니다. 그러나 레이아웃 그리기 시작 전.

Helper::beforeLayout ($layoutFile)

레이아웃 렌더링 시작 전에 호출됩니다. 레이아웃 파일 이름을 인수로 사용합니다.

Helper::afterLayout ($layoutFile)
레이아웃의 렌어링 완료후에 불려집니다. 레이아웃 파일 이름을 인수로 사용합니다.

코어 헬퍼

캐시 헬퍼

뷰 콘텐츠를 캐시하는 핵심 의해 사용됩니다.

FormHelper

HTML 양식과 자동 생성되는 양식 요소를 만듭니다. 또한 검증 문제를 처리합니다.

HtmlHelper

정형식의 마크 업을 만들기위한 편리한 메소드입니다. 이미지, 링크, 헤더 태그 등.

JsHelper

다양한 Javascript 라이브러리와 호환되는 Javascript를 작성하는 데 사용됩니다.

NumberHelper

숫자 및 통화를 성형합니다.

Paginator

모델 데이터의 페이지 전환 및 정렬.

RSS

RSS 피드 및 XML 데이터를 출력하는 편리한 메소드입니다.

세션 헬퍼

보기에서 세션 값을 읽어 들여 액세스합니다.

TextHelper

스마트 링크, 하이라이트, 워드 스마트 잘리지.

Time 헬퍼

근방 검출 (내년 여부?)와 근사한 문자열 성형 (Today, 10:30 am)과 시간대 변환을합니다.

'PHP' 카테고리의 다른 글

PHP : ini_set() 함수  (0) 2015.05.19
CakePHP - View - Json 과 XML 뷰  (0) 2015.05.13
CakePHP - 뷰 - 테마  (0) 2015.05.13
CakePHP - View  (0) 2015.05.12
[CakePHP] Controller - Components  (0) 2015.05.08
Posted by dewnine
,

JSON과 XML 뷰

CakePHP2.1는 새로운 두 뷰 클래스가 있습니다. XmlViewJsonView를 사용하면 XML 및 JSON 응답을 쉽게 만들 수 있으며, RequestHandlerComponent 과 결합 할 수 있습니다.

RequestHandlerComponent를 사용하여 xmljson 확장 지원을 사용하여 자동으로 새로운 뷰 클래스에 영향을 미칠 수 있습니다. XmlViewJsonView는 페이지의 나머지 부분에서 데이터 뷰를 참조해주세요.

데이터 뷰를 생성하려면 두 가지 방법이 있습니다. 첫째는 _serialize 키를 사용하는 것입니다. 두 번째는 보통의 뷰 파일을 만드는 방법입니다.

데이터 뷰를 활성화

데이터 뷰 클래스를 사용하기 전에 약간의 설정이 필요합니다. :

  1. Router::parseExtensions()를 사용하여 json과 xml 확장자를 활성화 해주세요. 이 설정에 따라 라우터가 여러 확장자를 핸들링 할 수 있게됩니다.
  2. RequestHandlerComponent를 컨트롤러의 컴포넌트 리스트에 추가하세요. 이 설정으로 콘텐츠 유형에 따라 자동으로 뷰 클래스가 바뀌게됩니다.

Router::parseExtensions('json');를 라우터 파일에 추가하면 .json 확장자의 요청을 받았을 때와 application/json 헤더를받은 때에는 CakePHP가 자동으로 뷰 클래스 전환하게됩니다 .

직렬화 키와 함께 데이터 뷰를 사용

_serialize 키는 데이터 뷰를 사용하고있을 때 다른 뷰 변수가 직렬화 될 것인지 아닌지를 나타내는 특별한 뷰 변수입니다. 데이터가 json/xml로 변환되기 전에 사용자 정의 포맷터가 필요하지 않은 경우 컨트롤러 액션을위한 뷰 파일의 정의를 생략 할 수 있습니다.

만약 응답을 생성하기 전에 뷰 변수의 조작과 성형이 필요한 경우 뷰 파일을 사용해야합니다. 그 때 _serialize 값은 문자열 또는 직렬화 된 뷰 변수의 배열입니다. :

  class PostsController extends AppController {
     public function index () {
         $this->set('posts', $this->paginate ());
         $this->set('_serialize', array('posts'));
     }
 }

연결된 뷰 변수의 배열로 _serialize을 정의 할 수도 있습니다. :

  class PostsController extends AppController {
     public function index () {
         // some code that created $posts and $comments
         $this->set(compact('posts', 'comments'));
         $this->set('_serialize', array('posts', 'comments'));
     }
 }

배열로서 _serialize를 정의하면 XmlView 을 사용하는 경우에 최상위 요소로 <response>가 자동으로 추가되는 장점이 있습니다. 만약 _serialize 문자열을 설정하여 XmlView를 사용하는 경우 뷰 변수가 단일의 최상위 요소로 되어 있는지 확인하십시오. 단일 최상위 요소가 없다면 Xml의 생성은 실패 할 것이다.

뷰 파일과 함께 데이터 뷰를 사용

최종 출력을 생성하기 전에 뷰의 내용에 어떤 조작이 필요한 경우에는 뷰 파일을 사용해야합니다. 예를 들어, 자동 생성 된 HTML을 포함한 필드가 posts에 있었다고하면 아마도 JSON 응답에서는 제외하고 싶을 것입니다. 이러한 상황에서 뷰 파일은 유용합니다. :

 // 컨트롤러 코드
 class PostsController extends AppController {
     public function index () {
         $this->set(compact('posts', 'comments'));
     }
 }

 // 뷰 코드 - app/View/Posts/json/index.ctp
 foreach($posts as & $post) {
     unset($post['Post']['generated_html']);
 }
 echo json_encode(compact('posts', 'comments'));

좀더 복잡한 작업을 할 수 있으며, 또한 성형을 위해 헬퍼를 사용할 수 있습니다.

데이터 뷰 클래스는 레이아웃을 지원하지 않습니다. 뷰 파일이 연재 된 내용을 출력하는 것을 가정합니다.

class XmlView

Xml 뷰 데이터를 생성하기위한 클래스입니다. XmlView의 사용법은 위의 설명을 참조하십시오.

class JsonView

Json 뷰 데이터를 생성하기위한 클래스입니다. JsonView의 사용법은 위의 설명을 참조하십시오.

'PHP' 카테고리의 다른 글

PHP : ini_set() 함수  (0) 2015.05.19
CakePHP- View - Helper  (0) 2015.05.14
CakePHP - 뷰 - 테마  (0) 2015.05.13
CakePHP - View  (0) 2015.05.12
[CakePHP] Controller - Components  (0) 2015.05.08
Posted by dewnine
,

CakePHP - 뷰 - 테마

PHP 2015. 5. 13. 18:22

테마

테마는 페이지의 모양을 쉽고 빠르게 전환 할 수있게된다는 장점이 있습니다.

테마를 사용하기 위해서는 컨트롤러에서 테마 이름을 지정하십시오.

  class ExampleController extends AppController {
     public $theme = 'Example';
 }

버전 2.1에서 변경 : 버전 2.1 이전에서는 $ this-> viewClass = ‘Theme’라는 설정이 필요했습니다. 2.1이 설정은 필요없고, 일반 View 클래스가 테마를 지원합니다.

또한 테마의 설정이나 변경은 액션 또는 beforeFilter과 beforeRender 등의 콜백 함수 내에서 할 수 있습니다.

  $this -> theme = 'AnotherExample';

테마보기 파일은 /app/View/Themed/ 폴더에 배치해야합니다. Themed 폴더에 테마 이름의 폴더를 작성하십시오. 위의 예에서 말하는 테마는 /app/View/Themed/AnotherExample에 배치하는 형태입니다. 이것은 중용합니다만, CakePHP는 CamelCase 테마 이름을 기대하고 있다는 것을 기억하십시오. 또한 /app/View/Themed/Example/ 아래 /app/View/ 와 똑같은 구조로 하십시오.

예를 들어, Posts 컨트롤러의 edit 액션을위한 뷰 파일은 /app/View/Themed/Example/Posts/edit.ctp입니다. 또한 레이아웃 파일은 /app/View/Themed/Example/Layouts/ 배치됩니다.

뷰 파일을 테마로 찾지 못하면 CakePHP는 /app/View/ 폴더를 찾습니다. 따라서 마스터 뷰 파일을 작성하여 테마 폴더에 덮어 쓰기가 필요한 파일 만 배치하면 잘됩니다.

테마 어셋

테마는 뷰 파일처럼 정적 어셋을 포함 할 수 있습니다. 테마는 webroot 디렉토리에있는 어셋을 얼마든지 필요한만큼 가져올 수 있습니다. 그 결과, 테마 패키징과 배포는 간단하게되어 있습니다. 개발에도 테마 자산에 대한 요청은 Dispatcher에 의해 처리됩니다. 프로덕션 환경에서의 성능을 개선하기 위해 테마의 어셋을 애플리케이션의 webroot 디렉토리에 복사하거나 심볼릭 링크를 붙이는 것이 좋습니다. 자세한 내용은 다음을 참조하십시오.

새로운 테마의 webroot를 사용하려면 app/View/Themed/<themeName>/webroot<path_to_file>과 같은 디렉토리를 테마에 작성하십시오. 디스패쳐 뷰 패스로 부터 올바른 테마 어셋을 검색을 핸들링합니다.

CakePHP의 모든 내장 헬퍼는 테마에 대응하여 자동으로 올바른 경로가 생성됩니다. 뷰 파일처럼 테마 폴더에 파일이없는 경우 기본 webroot 폴더가 기본이 됩니다.

  // 'purple_cupcake'라는 이름의 테마일 경우
 $this -> Html -> css ('main.css');

 // 경로 생성은 다음과 같다
/theme/purple_cupcake/css/main.css

 // 링크
 app/View/Themed/PurpleCupcake/webroot/css/main.css

플러그인과 테마 어셋의 성능을 개선하기

PHP를 통해 어셋을 제공하면 PHP를 통하지 않고 어셋을 제공 한 경우보다 확실히 느리다고 알려져 있습니다. 코어 팀은 최대한 빠른 플러그인과 테마의 자산을 제공하고자 꾸준히 노력하고 있습니다만, 더 고성능이 요구되는 상황이 있을지도 모릅니다. 그런 상황에서 심볼릭 링크를 걸거나 플러그인과 테마의 어셋을 CakePHP에 의해 사용되고있는 app/webroot 경로와 일치하는 디렉터리로 복사하는 것을 추천합니다.

  • app/Plugin/DebugKit/webroot/js/my_file.jsapp/webroot/debug_kit/js/my_file.js가 됩니다.
  • app/View/Themed/Navy/webroot/css/navy.cssapp/webroot/theme/Navy/css/navy.css가 됩니다.

'PHP' 카테고리의 다른 글

CakePHP- View - Helper  (0) 2015.05.14
CakePHP - View - Json 과 XML 뷰  (0) 2015.05.13
CakePHP - View  (0) 2015.05.12
[CakePHP] Controller - Components  (0) 2015.05.08
[CakePHP] Controller - PageController  (0) 2015.05.08
Posted by dewnine
,

CakePHP - View

PHP 2015. 5. 12. 18:56

뷰(View)는 MVC의 V입니다. 뷰는 요청에 대한 출력을 생성하는 역할을 담당합니다. 여기서 말하는 출력은 대부분의 경우 HTML 폼이나 XML, JSON 등을 의미하지만 파일 스트림의 생성과 사용자가 다운로드 가능한 PDF를 생성 할 뷰 레이어의 역할입니다.

CakePHP는 아래의 전형적인 그리기 시나리오에 대응하기위한 몇 가지 기본 뷰 클래스를 준비하고 있습니다. :

  • XML이나 JSON 웹 서비스를 만들 때 JSON과 XML 뷰 를 사용할 수 있습니다.
  • 보호 된 파일과 동적으로 생성 된 파일을 제공하는 경우, 미디어 뷰 를 사용할 수 있습니다.
  • 여러 테마의 뷰를 작성하는 경우 테마 를 사용할 수 있습니다.

뷰 템플릿

CakePHP의 뷰 레이어는 사용자와의 대화 수단입니다. 대부분의 경우 뷰는(X)HTML 문서를 브라우저에 반환합니다. 하지만 가끔은 Flash 개체에 AMF 데이터를 제공하거나 SOAP를 통해 원격 애플리케이션에 반응하거나 CSV 파일을 출력 할 필요가 있을지도 모릅니다.

기본적으로 CakePHP의 뷰 파일은 일반적인 PHP로 작성되고 확장자는 .ctp(CakePHP Template)입니다. 뷰 파일은 컨트롤러로부터 받은 데이터를 가져 오는 데 필요한 로직이 적혀 있습니다. 만약 Twig와 Smarty와 같은 템플릿 언어를 사용 싶다면 뷰의 서브 클래스가 템플릿 언어와 CakePHP의 중개를 해주는 것입니다.

뷰 파일은 /app/View/ 에있는 컨트롤러 이름의 폴더에 관련된 액션 이름으로 저장됩니다. 예를 들어, Products 컨트롤러의 “view()”액션 뷰 파일은 일반적으로/app/View/Products/view.ctp입니다.

CakePHP의 뷰 레이어는 여러 파트에 의해 만들어지고 있습니다. 각 파트는 각각 역할을 가지고 있으며, 이 장에서 설명하고 있습니다. :

  • View : 뷰는 실행중인 작업 특정 페이지의 일부분입니다. 응용 프로그램의 응답의 중심입니다.
  • Element : 재사용 가능한 간단한 코드입니다. 요소는 보통 뷰에서 그려집니다.
  • Layout : 응용 프로그램의 많은 인터페이스를 랩하고있을 표시 코드를 포함하는 뷰 파일입니다. 대부분의 뷰는 레이아웃 속에 그려집니다.
  • Helper :이 클래스는 뷰 레이어의 다양한 장소에서 필요한 로직을 캡슐화합니다. 특히, CakePHP 도우미 양식의 구축 및 AJAX 기능의 구축 모델 데이터의 페이지 전환, RSS 피드의 제공 등을 도와줍니다.

뷰의 상속

버전 2.1에서 추가.

뷰의 상속에 의해 어떠한 뷰를 다른 뷰에서 랩핑 할 수 있습니다. 뷰 블록 과 결합하여 뷰를 DRY 로 유지하기위한 강력한 방법을 제공합니다. 예를 들어, 당신이 작성하는 응용 프로그램의 특정 뷰에서 사이드 바의 렌더링을 바꿀 필요가 있다고 가정합니다. 이 경우 일반적인 뷰 파일을 상속하여 사이드 바의 마크업의 반복을 피할 수 있습니다. 이것은 다음과 같은 변경만으로 간단하게 가능합니다. :

 //app/View/Common/view.ctp
 <h1> <?php echo $this->fetch('title');?> </h1>
 <?php echo $this->fetch('content');?> 

 <div class = "actions">
 <h3> Related actions </h3>
 <ul>
      <?php echo $this->fetch('sidebar');?> 
 </ul>
 </div>

이 뷰 파일이 부모보기로 사용되었다고합니다. 그러자 sidebartitle 블록이 정의 된 뷰가 상속되는 것이 기대됩니다. content 블록은 CakePHP가 만드는 특별한 블록에서 뷰의 상속에 포착되지 않은 모든 콘텐츠가 포함되어 있습니다. 뷰 파일에 post 데이터가 저장되어있는 $posts라는 변수가있는 경우 뷰는 다음과 같이됩니다. :

<?php
//app/View/Posts/view.ctp
 $this->extend('/Common/view');

 $this->assign('title', $post);

 $this->start('sidebar');
 ?> 
 <li>
 <?php
 echo $this->Html->link('edit', array(
     'action'=> 'edit'
     $post [ 'Post'] [ 'id']
 ));?> 
 </li>
 <?php $this->end();?> 

//나머지 내용은 부모 뷰의 'content'블록으로 사용할 수 있습니다.
 <?php echo h($post [ 'Post'] [ 'body');

위의 예는 어떻게 뷰를 상속 할 수 있는지를 보여 주며 블록 세트를 생성합니다. 몇 가지 정의되지 않은 블록은 포착되고 content라는 특별한 이름의 블록에 배치됩니다. 뷰에 extend()의 호출이 포함 된 경우 현재 뷰 파일은 끝까지 실행됩니다. 일단 실행이 완료되면 상속 된 뷰가 그려집니다. 하나의 뷰 파일에서 두 번 이상 extend()가 호출 될 경우 다음 처리되는 부모 뷰를 덮어 씁니다. :

 $this->extend('/Common/view');
 $this->extend('/Common/index');

이 예에서는/Common/index.ctp를 부모 뷰와 그리기 결과를 얻을 수 있습니다.

상속 된 뷰는 원하는만큼 중첩 할 수 있습니다. 극단적 인 이야기 모든 뷰에서 다른 뷰를 상속하는 것조차 할 수 있습니다. 이 경우 각 부모 뷰는 하나 이전 뷰의 내용을 content 블록으로 가져올 수 있습니다.

content를 블록 이름으로 사용하는 것은 피해야한다. CakePHP는 상속 된 뷰에서 포착되지 않은 콘텐츠로 취급 해 버립니다.

뷰 블록을 사용

버전 2.1에서 추가.

뷰 블록은 $scripts_for_layout 대신 뷰/레이아웃 안에서는 어디에서나 슬롯이나 블록을 정의 할 수있는 확장 가능한 API를 제공합니다. 예를 들어 사이드 바 및 레이아웃의 끝과 시작에 어셋 읽기 영역의 구현등이 문이 블록의 전형적인 사용 예입니다. 블록을 구현하는 두 가지 방법이 있습니다. 캡쳐되는 블록으로 하거나 직접 할당 될 수 있습니다. start(), append(), end() 메서드는 포착되는 블록과 함께 작동합니다. :

 //sidebar 블록 만들기
 $this->start('sidebar');
 echo $this->element('sidebar/recent_topics');
 echo $this->element('sidebar/recent_comments');
 $this->end();


 //sidebar의 끝에 추가
 $this->append('sidebar');
 echo $this->element('sidebar/popular_topics');
 $this->end();

start()를 여러 번 사용하여 블록을 추가 할 수 있습니다. assign()는 클리어 하거나 임의의 타이밍에 블록을 덮어쓰는데 사용됩니다. :

 //sidebar 블록에서 이전 내용을 지우려면
 $this->assign('sidebar', '');

2.3에서 몇 가지 방법이 블록구조에 추가되었습니다. prepend()는 기존의 블록의 시작 부분에 내용을 추가합니다. :

 //sidebar의 선두에 추가
 $this->prepend('sidebar', 'this content goes on top of sidebar');

startIfEmpty()는 블록이 비어있거나 또는 정의되지 않은 경우에만 블록을 시작하고자 할 때 사용합니다. 블록이 이미 존재하는 경우는 포착된 콘텐츠는 폐기됩니다. 블록의 내용이 존재하지 않는 경우에 대해서 디폴트 내용을 준비하고 싶은 경우에 사용하면 편리합니다. :

//뷰 파일
//navbar 블록을 생성
 $this-> startIfEmpty('navbar');
 echo $this-> element('navbar');
 echo $this-> element('notifications');
 $this-> end();
 //부모의 view/layout
 <?php $this->startIfEmpty('navbar');?> 
 <p> 블록이 시점에서 정의되지 않은 경우, 대신해서 이 내용을 표시합니다. </p>
 <?php $this->end();?> 

//부모 view/layout의 어딘가 다른 곳
 echo $this-> fetch('navbar');

위의 예에서는 navbar 블록에 첫 번째 섹션에서 추가 된 내용 만 저장됩니다. 이 블록은 자식 뷰에 정의되어 있기 때문에 기본 내용은

태그와 함께 삭제됩니다.

content라는 블록의 사용은 피해야한다. 이 이름은 CakePHP 내부에서 뷰의 상속 레이아웃의 뷰 콘텐츠를 위해 사용하고 있습니다.

블록 표시

버전 2.1에서 추가.

블록의 표시는 fetch() 메소드를 사용합니다. fetch()는 블록이 존재하지 않았던 경우 ‘’를 반환하기 때문에 블록이 안전하게 출력됩니다. :

 echo $this->fetch('sidebar');

fetch를 사용하면 블록이 존재하는지 여부에 따라 블록으로 싸여져있는 내용의 표시를 전환 할 수 있습니다. :

 //in app/View/Layouts/default.ctp
 <?php if($this->fetch('menu')) :?> 
 <div class = "menu">
 <h3> Menu options </h3>
      <?php echo $this->fetch('menu');?> 
 </div>
 <?php endif;?>

2.3.0에서 블록의 기본 값을 지정할 수있게되었습니다. 이에 따라 블록의 내용이 비어있을 때 placeholder를 표시하는 것이 쉽게 가능합니다. 기본값은 2번째 인수로 지정합니다. :

  <div class = "shopping-cart">
 <h3> Your Cart </h3>
      <?php echo $this->fetch('cart', 'Your cart is empty');?> 
 </div>

버전 2.3에서 변경 : $default 인수는 2.3에 추가되었습니다.

스크립트와 CSS 파일의 블록을 사용

버전 2.1에서 추가.

블록은 비추천 레이아웃 변수 $scripts_for_layout을 바꿉니다. 이 변수 대신에 블록을 사용해야합니다. HtmlHelper는 뷰 블록을 연결합니다. script(), css(), meta() 의 각 메소드는 inline = false 옵션이 전달될 때 각각 같은 이름의 블록을 갱신합니다. :

  <?php
//뷰 파일에서
 $this->Html->script('carousel', array('inline'=> false));
 $this->Html->css('carousel', array('inline'=> false));
 ?> 

//레이아웃 파일 중
 <! DOCTYPE html>
 <html lang = "en">
 <head>
 <title> <?php echo $this->fetch('title');?> </title>
      <?php echo $this->fetch('script');?> 
      <?php echo $this->fetch('css');?> 
 </head>
//레이아웃이 아래 계속

HtmlHelper 스크립트와 CSS가 어떤 블록에 대응하는 방법을 제어합니다. :

//뷰 중
 $this->Html->script('carousel', array('block'=> 'scriptBottom'));

//레이아웃 중
 echo $this->fetch('scriptBottom');

레이아웃

레이아웃은 뷰를 감싸는 표시 용 코드를 포함합니다. 모든 뷰에서 보여주기를 원한다면 레이아웃에 배치되어야합니다.

레이아웃 파일은 /app/View/Layouts에 배치되어야합니다. 새로운 기본 레이아웃을 /app/View/Layouts/default.ctp로 작성하여 CakePHP의 기본 레이아웃은 덮어 씁니다. 일단 새로운 기본 레이아웃이 만들어지면 페이지가 렌더링 될 때 컨트롤러에 의해 렌더링 된 뷰 코드가 새로운 기본 레이아웃의 내부에 배치되게 됩니다.

레이아웃을 만들 때 뷰의 코드가 어디에 배치되는지를 CakePHP에 알려줄 필요가 있습니다. 그러기 위해서는 만든 레이아웃에 $this-> fetch(‘content’)가 포함되어 있는지 확인하십시오. 그러면 기본 레이아웃이 어떤 것인지 실제로 살펴보겠습니다. :

  <! DOCTYPE html>
 <html lang = "en">
 <head>
 <title> <?php echo $title_for_layout?> </title>
 <link rel = "shortcut icon"href = "favicon.ico"type = "image/x-icon">
 <! - 외부 파일과 스크립트 파일이 여기에로드됩니다(자세한 내용은 HTML 헬퍼를 참조하십시오) ->
 <?php
 echo $this->fetch('meta');
 echo $this->fetch('css');
 echo $this->fetch('script');
 ?> 
 </head>
 <body>

 <! - 만약 모든 뷰에서 메뉴를 표시 할 경우,
 여기에로드합니다.  ->
 <div id = "header">
 <div id = "menu"> ... </div>
 </div>

 <! - 뷰에 표시 할 것은 여기에 배치합니다.  ->
 <?php echo $this->fetch('content');?> 

 <! - 각 페이지에 표시 할 바닥 글은 여기에 추가하십시오.  ->
 <div id = "footer"> ... </div>

 </body>
 </html>

2.1 이전 버전에서는 fetch() 메소드는 사용할 수 없습니다. fetch('content')$content_for_layout을 대체 fetch('meta'), fetch('css'), fetch('script')의 각 행은 버전 2.0에서는 $scripts_for_layout 변수에 포함되어 있습니다.

내장 HtmlHelper를 사용하는 뷰의 경우, script, css, meta 블록에 정의 된 일부 내용이 포함되어 있습니다. 뷰에서 javascript와 CSS 파일이 포함 된 것은 편리합니다.

HtmlHelper::css() 와 HtmlHelper::script() 을 뷰 파일에서 사용할 때, html 소스를 같은 이름으로 블록 안에 배치하는 ‘inline’옵션은 ‘false’로하십시오.(자세한 사용법은 API를 참조하십시오.)

content 블록은 렌더링 된 뷰의 내용을 포함합니다.

$title_for_layout는 페이지 제목을 포함합니다. 이 변수는 자동으로 생성되지만 컨트롤러/뷰에서 설정하면 덮어 쓸 수 있습니다.

레이아웃의 제목을 설정하기 위해서는 컨트롤러에서 $title_for_layout 변수를 설정하는 것이 가장 간단합니다. :

  class UsersController extends AppController {
     public function view_active() {
         $this->set('title_for_layout', 'View Active Users');
     }
 }

또한 뷰 파일에서 title_for_layout 변수를 설정할 수도 있습니다. :

  $this->set('title_for_layout', $titleContent);

원하는만큼 레이아웃을 만들 수 있습니다. 레이아웃은 app/View/Layouts 디렉토리에 파일을 만들고, 컨트롤러 액션 중 하나 뷰 $layout 속성을 바꾸는 것만으로 만들 수 있습니다. :

 //컨트롤러
 public function admin_view() {
    //stuff
     $this->layout = 'admin';
 }

//뷰 파일에서
 $this->layout = 'loggedin';

예를 들어 내 사이트에 작은 광고 배너 영역이 있다고합니다. 이 경우, 작은 광고 영역이 포함 된 새로운 레이아웃을 만들어 다음과 같이 전체 컨트롤러의 액션에서 지정하는 것도 가능합니다.:

  class UsersController extends AppController {
     public function view_active() {
         $this->set('title_for_layout', 'View Active Users');
         $this->layout = 'default_small_ad';
     }

     public function view_image() {
         $this->layout = 'image';
        //output user image
     }
 }

CakePHP는 두 코어 레이아웃(CakePHP의 기본 레이아웃 외에) ‘ajax’와 ‘flash’를 제공하고 있습니다. Ajax 레이아웃은 Ajax 응답을 조립하기 위해 편리하고 빈 레이아웃으로 되어 있습니다.(ajax 호출은 인터페이스를 완벽하게 표현 한다기 보다는 약간의 마크 업이 필요한 것이 대부분입니다.) flash 레이아웃은 Controller::flash() 메소드 메시지 표시에 사용됩니다.

쉽고 빠르게 text/html이 아닌 컨텐츠를 제공하기 위해 다른 세 가지 핵심 레이아웃, xml, js, rss가 있습니다.

플러그인에서 레이아웃을 사용

버전 2.1에서 추가.

만약 기존의 플러그인에서 레이아웃을 사용하려면, 플러그인 기법 을 사용할 수 있습니다. 컨텍트 플러그인에서 컨텍트의 레이아웃을 사용하는 경우는 다음과 같습니다. :

  class UsersController extends AppController {
     public function view_active() {
         $this->layout = 'Contacts.contact';
     }
 }

엘리먼트

많은 응용 프로그램에는 다양한 페이지에서 때로는 다른 레이아웃의 페이지에서 반복 요구되는 표시 용 코드의 작은 블록이 있습니다. CakePHP는 재사용이 필요한 웹 사이트의 파트를 계속해서 사용에 도움을줍니다. 이 재사용 가능한 부품은 엘리먼트라고합니다. 광고, 도움말 박스, 네비게이션 컨트롤 엑스트라 메뉴, 로그인 폼 풍선은 CakePHP에서 엘리먼트로 구현됩니다. 엘리먼트는 기본적으로 다른 뷰 레이아웃 요소에 포함 할 수있는 작은 뷰입니다. 요소는 뷰에서 반복 렌더링되는 부분의 가독성을 개선하기 위해 사용할 수 있습니다. 응용 프로그램의 내용의 일부를 재사용하는 데 도움이됩니다.

엘리먼트는/app/View/Elements/폴더에 .ctp 확장자를 가진 이름으로 배치됩니다. 다음 예제는 뷰의 element 메소드를 사용하여 출력하고 있습니다. :

  echo $this->element('helpbox');

요소에 변수를 전달

element 메서드의 두 번째 인수를 통해 요소에 데이터를 전달할 수 있습니다. :

  echo $this->element('helpbox', array(
     "helptext"=> "Oh, this text is very helpful."
 ));

요소 파일의 내부에서는 인수로 전달 된 모든 변수를 매개 변수 배열의 구성원으로 사용할 수 있습니다.(뷰 파일에서 컨트롤러 Controller::set() 메소드처럼 동작합니다.) 위의 예에서는/app/View/Elements/helpbox.ctp에서 $helptext 변수를 사용할 수 있습니다. :

 //app/View/Elements/helpbox.ctp의 내부
 echo $helptext; //"Oh, this text is very helpful."라고 출력됩니다

View::element() 메서드는 엘리먼트에 대한 옵션을 지원합니다. 지원되는 옵션은 ‘cache’와 ‘callbacks’입니다. 예를 들면 :

  echo $this->element('helpbox', array(
         "helptext"=> "This is passed to the element as $helptext"
         "foobar"=> "This is passed to the element as $foobar"
     ),
     array(
         "cache"=> "long_view"//"long_view"캐시 설정을 사용합니다
         "callbacks"=> true//요소에서 before/afterRender가 불려 true로 설정하십시오
     )
 );

요소는 Cache 클래스를 통해 캐시됩니다. 구성된 캐시의 어느 하나에 요소가 저장되도록 설정할 수 있습니다. 그 결과, 어디에 언제까지 엘리먼트를 저장할 것인지를 유연하게 제어 할 수 있습니다. 응용 프로그램에서 동일한 요소의 다른 버전을 캐시하기 위해서는 다음과 같은 형식을 사용하여 독특한 캐시 키를 제공하십시오. :

  $this->element('helpbox', array(), array(
         "cache"=> array('config'=> 'short', 'key'=> 'unique value')
     )
 );

requestAction() 을 사용해서 요소의 장점을 최대한 활용할 수 있습니다. requestAction() 함수는 뷰 변수를 컨트롤러 액션에서 따온 배열로서 돌려줍니다. 이에 따라 요소를 진정한 MVC 스타일에 유지하는 것이 가능합니다. 엘리먼트용의 뷰 변수를 준비한 컨트롤러 액션을 만들고 그 뒤 컨트롤러로부터 엘리먼트 뷰 변수를 주기위해, element() 메서드의 두 번째 인수 속에서 requestAction()를 호출 해주세요.

이것을 실제로 확인하기 위해 Post의 예제 컨트롤러에 다음과 같은 코드를 추가하십시오. :

  class PostsController extends AppController {
    //...
     public function index() {
         $posts = $this->paginate();
         if($this->request->is('requested')) {
             return $posts;
         } else {
             $this->set('posts', $posts);
         }
     }
 }

그러면 엘리먼트 안에서 paginate된 posts 모델에 액세스 할 수 있습니다. 정렬 된 목록에서 최신의 5 건을 취득하기 위해서는 다음과 같이하면 좋습니다. :

 <h2> Latest Posts </h2>
 <?php $posts = $this->requestAction('posts/index/sort:created/direction:asc/limit:5'); ?> 
 <ol>
 <?php foreach($posts as $post) :?> 
 <li> <?php echo $post [ 'Post'] [ 'title'];?> </li>
 <?php endforeach;?> 
 </ol>

엘리먼트를 캐시하기

캐시 매개 변수의 전달만으로 CakePHP의 뷰 캐시의 혜택을 얻을 수 있습니다. true를 전달하면 ‘default’캐시 설정에 따라 엘리먼트가 캐시됩니다. false의 경우 어떤 캐시 설정을 사용할지를 설정할 수 있습니다. Cache 설정에 대한 자세한 내용은 Caching을 참조해주세요. 엘리먼트 캐시의 간단한 예는 다음과 같습니다. :

  echo $this->element('helpbox', array(), array('cache'=> true));

어떤 뷰에서 같은 엘리먼트가 두 번 이상 렌더링되는 경우 매번 다른 이름의 ‘key’매개 변수를 설정하여 확실하게 안정적으로 캐시 할 수 있습니다. 따라서 element()를 이전 호출시에 생성 된 캐시를 연속 element()의 호출의 결과로 덮어 것을 피할 수 있습니다. :

  echo $this->element(
     'helpbox'
     array('var'=> $var)
     array('cache'=> array('key'=> 'first_use', 'config'=> 'view_long')
 );

 echo $this->element(
     'helpbox'
     array('var'=> $differenVar)
     array('cache'=> array('key'=> 'second_use', 'config'=> 'view_long')
 );

위의 예에서는 2 개의 element()의 결과가 개별적으로 캐시되는 것이 보증되고 있습니다. 만약 모든 요소의시에서 동일한 설정을 사용하려면, View::$elementCache 를 설정하여 반복을 피할 수 있습니다. CakePHP는 element()에 아무것도 설정되어 있지 않은 경우,이 설정을 사용합니다.

플러그인 엘리먼트에 대한 요구

2.0

플러그인 엘리먼트를 로드하는 plugin 옵션을 사용하십시오.(버전 1.x의 data 옵션에서 이동했습니다.) :

  echo $this->element('helpbox', array(), array('plugin'=> 'Contacts'));

2.1

만약 플러그인을 사용하고 플러그인 요소를 사용하고 싶다고 생각한다면 익숙한 플러그인 기법 을 사용하는 것만으로 좋다. 뷰 컨트롤러/액션 플러그인 그리기 중일 때 다른 플러그인 이름이 사용되지 않으면 모든 엘리먼트에서 사용되는 플러그인 이름에 자동으로 접두사가 붙습니다. 만약 엘리먼트가 플러그인에 존재하지 않는 경우 메인 어플리케이션 폴더 안에서 검색됩니다. :

  echo $this->element('Contacts.helpbox');

만약 뷰가 플러그인의 일부이면 플러그인 이름을 생략 할 수 있습니다. 예를 들어, Contacts 플러그인 ContactsController 안에있는 경우 :

 echo $this->element('helpbox');
//and
 echo $this->element('Contacts.helpbox');

이들은 같은 엘리먼트의 렌더링 결과가 됩니다.

버전 2.1에서 변경 : $options[plugin] 옵션은 사용되지 않으며 대신 Plugin.element이 추가되었습니다.

독자적인 View 클래스 생성

데이터 뷰의 새로운 유형을 추가하려면 사용자 정의 뷰 클래스를 만들거나 어플리케이션에 사용자 정의 뷰의 렌더링 로직을 추가해야합니다. CakePHP의 뷰 클래스의 대부분의 구성 요소와 마찬가지로 몇 가지 규칙이 있습니다. :

  • 뷰 클래스는 App/View에 배치하십시오. 예) App/View/PdfView.php
  • 뷰 클래스 이름은 View를 클릭하십시오. 예) PdfView
  • 뷰 클래스 이름을 참조 할 때 View 접미사를 생략해야합니다. 예) $this-> viewClass = 'Pdf';
    또한 제대로 작동하도록 View를 상속합시다. :
 //in App/View/PdfView.php

 App::uses('View', 'View');
 class PdfView extends View {
     public function render($view = null $layout = null) {
        //custom logic here.
     }
 }

render 메소드를 대체하면 콘텐츠가 렌더링되는 방법을 완전히 제어 할 수 있습니다.

뷰 API

class View

뷰 메소드는 모든 뷰 요소 레이아웃 파일에서 액세스 할 수 있습니다. $this-> method()의 형식에서 호출하십시오.

View::set(string $var, mixed $value)

뷰는 컨트롤러 객체에서 볼 수있는 set()와 유사한 set() 메소드가 있습니다. 뷰 파일에서 set()를 사용하면 나중에 렌더링되는 레이아웃과 요소에 변수를 추가 할 수 있습니다. set()의 사용법에 대해 자세히 알고 싶다면, 컨트롤러 메소드를 참조해주세요.

뷰 파일은 다음과 같이 작성할 수 있습니다. :

  $this->set('activeMenuButton', 'posts');

그리고 레이아웃은 $activeMenuButton 변수를 사용할 수 ‘posts’라는 값입니다.

View::getVar(string $var)

$var라는 뷰 변수를 가져올 수 있습니다.

View::getVars()

현재 드로잉 범위에서 사용할 수있는 모든 뷰 변수의 목록을 가져옵니다. 변수 이름의 배열이 반환됩니다.

View::element(string $elementPath, array $data, array $options = array())

요소 또는 뷰의 일부를 그립니다. 더 자세히 알고 싶다면, 요소 를 참조하십시오.

View::uuid(string $object, mixed $url)

객체의 유형이나 URL에 따라 독특하고 무작위가 아닌 DOM ID를 생성합니다. 이 방법은 종종 JsHelper 같은 엘리먼트에 대한 독특한 DOM ID의 생성을 필요로하는 헬퍼에 의해 사용됩니다. :

$uuid = $this->uuid('form', array('controller'=> 'posts', 'action'=> 'index'));
//$uuid contains 'form0425fe3bad'

View::addScript(string $name, string $content)

내부의 스크립트 버퍼에 내용을 추가합니다. 이 버퍼는 레이아웃에서 $scripts_for_layout로 이용됩니다. 이 메소드는 javascript와 css를 직접 레이아웃에 추가 할 필요가있는 헬퍼를 만들 때 도움이됩니다. 레이아웃과 레이아웃 안의 요소에서 추가 된 스크립트는 $scripts_for_layout에 추가되지 않는다는 것을 명심하라. 이 방법은 대부분의 경우 JsHelper 과 HtmlHelper 도우미 헬퍼 중에서 사용됩니다.

버전 2.1에서 삭제 : 대신 뷰 블록을 사용 하는 기능을 사용하십시오.

View::blocks()

정의 된 모든 블록의 이름을 배열로 가져옵니다.

View::start($name)

뷰 블록에 대한 블록의 포착을 시작합니다. 뷰 블록을 사용 을 참조하십시오.

버전 2.1에서 추가.

View::end()

가장 최근에 시작된 블록의 포착을 종료합니다. 뷰 블록을 사용 을 참조하십시오.

버전 2.1에서 추가.

View::append($name, $content)

$name 블록에 추가합니다. 뷰 블록을 사용 을 참조하십시오.

버전 2.1에서 추가.

View : prepend($name, $content)

$name 블록의 시작 부분에 추가합니다. 뷰 블록을 사용 을 참조하십시오.

버전 2.3에서 추가.

View::startIfEmpty($name)

지정한 블록이 공백일 경우에만 블록을 시작합니다. 블록의 모든 컨텐츠를 캡처, 만약 블록이 이미 정의되어있는 경우는 파기됩니다.

버전 2.3에서 추가.

View::assign($name, $content)

블록의 값에 대입합니다. 이미 존재하고 있던 내용을 덮어 쓰게됩니다. 뷰 블록을 사용 을 참조하십시오.

버전 2.1에서 추가.

View::fetch($name )

블록의 값을 가지고옵니다. 정의되지 않은 블록의 경우 ‘가 돌아갑니다. 뷰 블록을 사용 을 참조하십시오.

버전 2.1에서 추가.

View::extend($name )

현재보기/요소/레이아웃을 지정의 이름으로 상속합니다. 뷰의 상속 을 참조하십시오.

버전 2.1에서 추가.

property View::$layout

현재 뷰가 래핑 된 레이아웃을 설정합니다.

property View::$elementCache

요소를 캐시하기 위해 사용되는 캐시 설정입니다. 이 속성을 설정하는 자식 요소를 캐시하는 데 사용되는 기본 설정이 변경됩니다. 이 기본값은 element 메서드 ‘cache’옵션이 사용된다고 덮어 씁니다.

property View::$request

CakeRequest 의 인스턴스입니다. 현재 요청에 대한 정보에 액세스하기 위해이 인스턴스를 사용합니다.

property View::$output

뷰 파일 또는 배치 컨텐츠 중 하나의 뷰에서 마지막으로 렌더링 된 콘텐츠가 포함되어 있습니다.

버전 2.1에서 철폐 : 대신 $view-> Blocks-> get(‘content’); 을 사용하십시오.

property View::$Blocks

ViewBlock 의 인스턴스입니다. 뷰의 렌더링 중에 뷰 차단 기능을 제공하기 위해 사용되고 있습니다.

버전 2.1에서 추가.

'PHP' 카테고리의 다른 글

CakePHP - View - Json 과 XML 뷰  (0) 2015.05.13
CakePHP - 뷰 - 테마  (0) 2015.05.13
[CakePHP] Controller - Components  (0) 2015.05.08
[CakePHP] Controller - PageController  (0) 2015.05.08
[CakePHP] Controller - Scaffolding  (0) 2015.05.08
Posted by dewnine
,

컴포넌트

컴포넌트는 컨트롤러간에 공유되는 로직의 패키지입니다. 만약 컨트롤러간에 복사 및 붙여 넣기를 하고 싶은 부분이 있다면 몇 가지 기능을 컴포넌트로 랩핑 할 수 있을지도 모릅니다.

또한 CakePHP는 다음과 같은 목적으로 사용할 수있는 훌륭한 핵심 컴포넌트가 준비되어 있습니다. :

  • 보안
  • 세션
  • 액세스 제어
  • 이메일
  • 쿠키
  • 인증
  • 요청 처리
  • 페이지 전환

각 핵심 컴포넌트의 자세한 것은 각 장에서 설명합니다. 여기에서 독자적인 컴포넌트를 만드는 방법을 소개합니다. 컴포넌트를 작성함으로인해 컨트롤러의 코드가 깨끗한 상태로 유지되고 프로젝트에서 코드를 재사용하기 쉬워집니다.

컴포넌트의 설정

핵심 컴포넌트의 대부분은 설정을 필요로하고 있습니다. 컴포넌트가 설정을 필요로하고있는 예는 인증 과 Cookie 등입니다. 이러한 컴포넌트와 일반 컴포넌트의 설정은 대부분의 경우 $components 배열이나 컨트롤러의 beforeFilter() 메소드에서 이루어집니다. :

  class PostsController extends AppController {
     public $components = array(
         'Auth'=> array(
             'authorize'=> array( 'controller')
             'loginAction'=> array( 'controller'=> 'users', 'action'=> 'login')
         ),
         'Cookie'=> array( 'name'=> 'CookieMonster')
     );

이것은 $components 배열 요소를 설정하는 예입니다. 모든 핵심 컴포넌트는 이 방법으로 설정할 수 있습니다. 또한 컨트롤러의 beforeFilter() 메소드에서도 설정할 수 있습니다. 이것은 함수의 결과를 컴포넌트의 프로퍼티에 설정할 때 유용합니다. 위의 예는 다음과 같이 작성됩니다. :

  public function beforeFilter() {
     $this -> Auth -> authorize = array( 'controller');
     $this -> Auth -> loginAction = array( 'controller'=> 'users', 'action'=> 'login');

     $this -> Cookie -> name = 'CookieMonster';
 }

그러나 컴포넌트의 옵션을 컨트롤러의 beforeFilter()가 실행되기 전에 설정하는 것이 가능한 경우도 있습니다. 즉, 컴포넌트 중에는 $components 배열에 옵션을 설정할 수있는 것이 있습니다. :

  public $components = array(
     'DebugKit.Toolbar'=> array( 'panels'=> array( 'history', 'session'))
 );

각 컴포넌트가 어떤 설정 옵션을 제공하는지는 관련 문서를 참조하십시오.

공통 설정 중 하나에 className 옵션이 있습니다. 이 옵션을 사용하면 컴포넌트에 별명을 붙일 수 있습니다. 이 기능은 $this-> Auth 및 기타 컴포넌트의 참조를 자체적으로 구현하여 대체하고 싶을 때 유용합니다. :

  // app/Controller/PostsController.php
 class PostsController extends AppController {
     public $components = array(
         'Auth'=> array(
             'className'=> 'MyAuth'
         )
     );
 }

 // app/Controller/Component/MyAuthComponent.php
 App :: uses( 'AuthComponent', 'Controller/Component');
 class MyAuthComponent extends AuthComponent {
     // 코어 AuthComponent를 덮어쓸 코드를 추가
 }

위의 예에서는 컨트롤러에서 MyAuthComponent에 $this-> Auth라는 별명을 달고 있습니다.

별명을 붙인 컴포넌트는 컴포넌트가 사용하는 모든 곳의 인스턴스를 바꿉니다. 이것은 다른 컴포넌트의 내부를 포함합니다.

컴포넌트의 사용

일단 컴포넌트를 컨트롤에서 읽어 들였다면 사용하는 것은 매우 간단합니다. 사용중인 각 컴포넌트는 컨트롤러의 속성처럼 보입니다. 만일 SessionComponent 와 CookieComponent 를 컨트롤러로 읽어 들인 경우 다음과 같이 액세스 할 수 있습니다. :

  class PostsController extends AppController {
     public $components = array( 'Session', 'Cookie');

     public function delete() {
         if($this -> Post -> delete($this -> request -> data( 'Post.id')) {
             $this -> Session -> setFlash( 'Post deleted.');
             return $this -> redirect(array( 'action'=> 'index'));
         }
     }

모델과 컴포넌트 모두가 컨트롤러에 속성으로 추가되므로, 그들은 같은 ‘네임 스페이스’를 공유합니다. 컴포넌트와 모델에 같은 이름을 사용하지 않도록 주의하십시오.

컴포넌트의 동적 로딩

모든 컨트롤러 액션에서 모든 컴포넌트를 사용할 수 있도록 할 필요는 없을지도 모릅니다. 이러한 상황에서는 런타임에 컴포넌트 컬렉션을 사용하여 컴포넌트를 로드 할 수 있습니다. 컨트롤러 내부에서 다음과 같이 할 수 있습니다. :

  $this -> OneTimer = $this -> Components -> load( 'OneTimer');
 $this -> OneTimer -> getTime();

컴포넌트가 동적으로 로드 된 경우 초기화 메소드가 실행되지 않는 것을 기억하십시오. 이 메소드에서 읽어 들인 경우 로드 된 후 수동으로 실행해야합니다.

컴포넌트의 콜백

컴포넌트는 또한 몇 가지 요청 라이프 사이클에 요청 라이프 사이클을 늘릴 수 있는 콜백을 제공합니다. 컴포넌트가 제공하는 컴포넌트에 대한 자세한 내용은 컴포넌트 API 의 기본을 참조하십시오.

컴포넌트를 만들

응용 프로그램의 다양한 부분에서 복잡한 수학적 처리를 필요로하는 온라인 응용 프로그램을 가정합니다. 이제 컨트롤러의 곳곳에서 사용하기위한 공유 로직을 통합하기위한 컴포넌트를 만듭니다.

먼저, 새로운 컴포넌트 파일과 클래스를 만듭니다. /app/Controller/Component/MathComponent.php에 파일을 작성하십시오. 컴포넌트의 기본 구조는 다음과 같습니다. :

  App :: uses( 'Component', 'Controller');
 class MathComponent extends Component {
     public function doComplexOperation($amount1 $amount2) {
         return $amount1 + $amount2;
     }
 }

모든 컴포넌트는 Component 를 상속해야합니다. 상속되지 않은 경우, 예외가 발생합니다.

컨트롤러에서 컴포넌트를 로드

일단 컴포넌트가 완성되고 나면 컨트롤러의 $components 배열에있는 요소 이름(Component의 부분을 제거하는)을 대체하여 사용할 수있게합니다. 컨트롤러는 그 컴포넌트에 유래하는 새로운 속성을 자동으로 부여되는 것입니다. 그 속성을 통해 인스턴스에 액세스 할 수 있습니다. :

 /* 표준 $this-> Session뿐만 아니라 새로운 요소를 $this-> Math에서 사용할 수있게합니다.  * /
 public $components = array( 'Math', 'Session');

AppController에서 선언 된 컴포넌트는 다른 컨트롤러에서 선언 된 컴포넌트와 병합됩니다. 동일한 컴포넌트를 두 번 선언 할 필요는 없습니다.

컨트롤러에서 컴포넌트를 읽어 들일 때 컴포넌트의 생성자에 전달 파라메타를 선언 할 수 있습니다. 이 매개 변수는 컴포넌트에 의해 처리됩니다. :

  public $components = array(
     'Math'=> array(
         'precision'=> 2,
         'randomGenerator'=> 'srand'
     ),
     'Session', 'Auth'
 );

위의 예에서는 precision와 randomGenerator를 포함한 배열이 MathComponent :: __ construct()의 두 번째 인수로 전달됩니다. 컴포넌트의 공용 속성이나 인수로 전달되는 설정은 배열에 따라 값입니다.

컴포넌트에서 다른 컴포넌트를 사용

작성중인 컴포넌트에서 다른 컴포넌트를 사용하고 싶을 때이 가끔 있습니다. 그 경우 작성중인 컴포넌트에서 다른 컴포넌트를 로드 할 수 있으며, 그 방법은 컨트롤러에서 $components 변수를 사용하여 가져 오는 경우와 동일합니다. :

 // app/Controller/Component/CustomComponent.php
 App :: uses( 'Component', 'Controller');
 class CustomComponent extends Component {
     // 구현중인 컴포넌트를 사용하는 다른 컴포넌트
     public $components = array( 'Existing');

     public function initialize(Controller $controller) {
         $this -> Existing -> foo();
     }

     public function bar() {
         // ...
    }
 }

 // app/Controller/Component/ExistingComponent.php
 App :: uses( 'Component', 'Controller');
 class ExistingComponent extends Component {

     public function foo() {
         // ...
     }
 }

컨트롤러에서 가져온 컴포넌트와 달리 컴포넌트에서 컴포넌트를 가져온 경우 콜백이 불리지 않는 점에 유의하십시오.

컴포넌트 API

class Component

컴포넌트의 기본 클래스는 ComponentCollection 통해 공통의 핸들링 설정을 처리하도록 다른 컴포넌트를 지연로드 하기위한 여러 가지 방법을 제공합니다. 또한 컴포넌트의 모든 콜백의 프로토 타입을 제공합니다.

Component :: __construct(ComponentCollection $collection, $settings = array())

기본 컴포넌트 클래스의 생성자입니다. 모든 $settings 또는 공용 속성은 $settings에서 일치하는 값으로 변경됩니다.

콜백

Component :: initialize(Controller $controller)

initialize 메소드는 컨트롤러의 beforeFilter 전에 호출됩니다.

Component :: startup(Controller $controller)

startup 메소드는 컨트롤러의 beforeFilter 후 컨트롤러의 현재의 액션 핸들러 전에 호출됩니다.

Component :: beforeRender(Controller $controller)

beforeRender 메소드는 컨트롤러가 요청한 액션의 로직을 실행 한 후 뷰와 레이아웃이 그려지기 전에 호출됩니다.

Component :: shutdown(Controller $controller)

shutdown 메소드는 출력 결과가 브라우저로 전송되기 전에 호출됩니다.

Component :: beforeRedirect(Controller $controller $url, $status = null $exit = true)

beforeRedirect 메서드는 컨트롤러 redirect 메소드가 불려 때 다른 액션보다 먼저 불려집니다. 이 메소드가 false를 반환 할 때 컨트롤러는 Request 리디렉션을 중단합니다. $url, $status와 $exit 변수는 컨트롤러의 메소드와 같은 의미입니다. 또한 리디렉션 URL 문자열을 반환하거나 ‘url’와 ‘status’와 ‘exit’를 키로 가지는 연관 배열을 반환 할 수 있습니다. ‘status’와 ‘exit’는 선택 사항입니다.

'PHP' 카테고리의 다른 글

CakePHP - 뷰 - 테마  (0) 2015.05.13
CakePHP - View  (0) 2015.05.12
[CakePHP] Controller - PageController  (0) 2015.05.08
[CakePHP] Controller - Scaffolding  (0) 2015.05.08
[CakePHP] CakeResponse  (0) 2015.05.07
Posted by dewnine
,

페이지 컨트롤러

CakePHP는 기본 컨트롤러 PagesController.php를 제공합니다. 이것은 정적 콘텐츠를 제공하기위한 간단하고 보조적인 컨트롤러입니다. 설치 직후의 홈페이지는 컨트롤러를 사용해 생성되어 있습니다. 만약 app/View/Pages/about_us.ctp는 뷰 파일을 만들면 http://example.com/pages/about_us라는 URL로 액세스 할 수 있습니다. Pages Controller는 필요에 따라 언제든지 수정할 수 있습니다.

CakePHP 콘솔 유틸리티 “bake”을 사용하여 새 응용 프로그램을 굽는하면 PagesController는 app/Controller/폴더에 만들어집니다. 또한 lib/Cake/Console/Templates/skel/Controller/PagesController.php에서 파일을 복사 할 수 있습니다.

버전 2.1에서 변경 : CakePHP 2.0 Pages Controller는 lib/Cake의 일부였습니다. 2.1에서 Pages Controller는 코어의 일부가 없으며 app 폴더에 제공되게되었습니다.

 

미래 핵심이 업데이트되었을 때 문제를 피하기 위해 lib/Cake 폴더에있는 모든 파일도 직접 편집하지 마십시오.

'PHP' 카테고리의 다른 글

CakePHP - View  (0) 2015.05.12
[CakePHP] Controller - Components  (0) 2015.05.08
[CakePHP] Controller - Scaffolding  (0) 2015.05.08
[CakePHP] CakeResponse  (0) 2015.05.07
[CakePHP] CakeRequest 요청 객체  (0) 2015.05.07
Posted by dewnine
,

Scaffolding

응용 프로그램의 스캐 폴딩(scaffolding)은 개발자가 객체를 생성, 검색, 업데이트, 삭제 등 기본적인 어플리케이션을 정의, 생성하는 테크닉 입니다. CakePHP의 스캐 폴딩은 개체들이 서로 어떻게 관련되어 있는지를 정의하고 그 연결의 생성 및 삭제가 가능합니다.

scaffold를 만들려면 모델과 컨트롤러가 필요합니다. 컨트롤러에 $scaffold 변수를 설정하는 것만으로 동작합니다.

CakePHP의 스캐 폴딩은 꽤 훌륭합니다. 기본적인 CRUD 애플리케이션을 몇 분 안에 만들어 움직일 수 있습니다. 너무 좋기 때문에 프로덕션 환경에서 사용하고 싶을지도 모릅니다. 정말 좋은 것입니다만, 스캐 폴딩은 어디 까지나 단순한 발판에 불과하다는 것을 명심 하십시오. 발판은 프로젝트의 초기 단계에서 어쨌든 빨리 움직이게 하기 위해 거친 구조로되어 있습니다. 유연성이보다는 어쨌든 움직이기위한 일시적인 방법이라고 말할 수 있겠지요. 만약 로직과 뷰를 직접 정의하고 싶습니다 시작하면 코드를 작성하는 발판을 사용하는 것을 그만 둘 타이밍이라고 말할 수 있습니다. 다음 장에서 설명하는 CakePHP의 Bake 콘솔은 굉장한 다음 한걸음이며, 현재의 발판과 같은 결과가 되는 코드를 생성합니다.

스캐 폴딩은 web 어플리케이션 개발 초기에 필요한 코드를 얻을 수있는 좋은 방법입니다. 설계 초기 단계에서 데이터베이스 스키마 변경은 흔히 있는 일입니다. 그러나 이 것은 web 개발자는 확정 되지 않고 어떻게 사용될지 모르는 단계에서 입력 양식 만드는 것을 싫어한다는 단점이 발생합니다. 개발자의 부담을 경감시키기 위해 CakePHP는 스캐 폴딩 기능을 제공합니다. 스캐 폴딩은 데이터베이스 테이블을 분석하여 추가, 삭제, 편집 버튼이 붙어있는 표준 목록 편집을위한 표준 양식 데이터베이스의 1 레코드를보기위한 표준 뷰를 만듭니다.

스캐 폴딩을 추가하기 위해 컨트롤러에서 $scaffold 변수를 추가하십시오. :

   class CategoriesController extends AppController {
      public $scaffold;
  }

/app/Model/Category.php 기본적인 Category 모델 클래스를 이미 작성했다고하면 준비는 이상입니다. 새로운 발판을 보기 위하여 http://example.com/categories 를 방문해보세요.

발판이 만들어진 컨트롤러 메소드를 작성하면 생각대로의 결과가 나오지 않을 때가 있습니다. 예를 들어, 발판이 만들어진 컨트롤러에 index () 메소드를 작성한 경우 index 메소드는 스캐 폴딩 기능보다 우선적으로 그려집니다.

스캐 폴딩은 모델 사이의 관계에 대한 지식을 제공합니다. 만약 Category 모델이 User에 종속 (belongsTo)하고 있었을 경우, Category 목록에 관련있는 User의 ID가 표시되는 것입니다. 스캐 폴딩은 모델 사이의 관계에 대해 “알고”있습니다 만, 수동으로 모델의 관계를 나타내는 코드를 추가 할 때까지는 발판 뷰에 관련 레코드가 표시되지 않습니다. 예를 들어, 만약 Group이 여러 User를 가지고 (hasMany), User가 Group에 종속 (belongsTo)하는 경우 다음 코드를 User와 Group 모델에 수동으로 추가해야합니다. 이 코드를 추가하기 전에이라고 User 추가 양식 Group에 대한 select 박스가 공백으로 표시됩니다. :

   // In Group.php
   public $hasMany = 'User';
   // In User.php
   public $belongsTo = 'Group';

만약 ID가 아닌 다른 것 (예를 들어 사용자 이름 등)을 표시 할 경우 $displayField 변수를 모델로 설정하십시오. 그럼 스캐 폴딩에서 ID 대신 이름으로 카테고리에 관련한 사용자가 표시되도록 User 클래스에 $displayField을 설정하자. :

  class User extends AppModel {
     public $name = 'User';
     public $displayField = 'first_name';
 }

Scaffolding을 사용하여 간단한 관리 인터페이스를 작성하기

만약 app/Config/core.php에서 관리 라우팅을 유효하도록 할 경우, Configure::write(‘Routing.prefixes’, array(‘admin’));로하는 것으로 관리자 인터페이스를 생성하기 위해 검사 폴딩을 사용할 수있게됩니다.

일단 관리 라우팅을 활성화 한 후 스캐 폴딩 변수에 admin 접두어를 설정하십시오. :

  public $scaffold = 'admin';

이상으로 관리 발판 액션에 액세스 할 수 있습니다. :

 http://example.com/admin/controller/index
 http://example.com/admin/controller/view
 http://example.com/admin/controller/edit
 http://example.com/admin/controller/add
 http://example.com/admin/controller/delete

이것은 간단한 백엔드 인터페이스를 빠르게 만들 수있는 간단한 방법입니다. 그러나 관리용 및 비 관리용 스케폴딩의 메소드를 동시에 사용할 수 없다는 것을 기억하십시오. 보통의 스케폴딩에서는 개별 메소드를 덮어 쓰거나 자체 구현으로 대체 할 수 있습니다. :

 public function admin_view ($id = null) {
   // custom code here
 }

일단 발판 액션을 옮기게 되면 액션과 동일한 뷰 파일을 작성해야 합니다.

Scaffold 뷰의 커스트마이징

만약 발판으로 생성 된 뷰에 약간의 차이가 발견 것 같으면 템플릿을 만들 수 있습니다. 프로덕션 환경에서 이 기술을 사용하는 것은별로 추천하지 않지만, 프로토 타입 개발 사이라면 여기에서 소개하는 커스트마이즈는 도움이 됩니다.

특정 컨트롤러 (예 PostsController)에 대한 자신의 발판 뷰는 다음과 같이 대체한다. :

/app/View/Posts/scaffold.index.ctp
/app/View/Posts/scaffold.form.ctp
/app/View/Posts/scaffold.view.ctp

모든 컨트롤러에 대한 자신의 스케폴딩 뷰는 다음과 같이 대체해야 합니다. :

/app/View/Scaffolds/index.ctp
/app/View/Scaffolds/form.ctp
/app/View/Scaffolds/view.ctp

'PHP' 카테고리의 다른 글

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

[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
,

요청(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
,