2010-01-17 2 views
0

나는 내 자신의 프로젝트를위한 기본 템플릿 클래스를 작성 중이다. 개인 배열템플릿 클래스를 모델하는 방법

  1. 상점 변수 :

    <?php print $pageTitle; ?> 
    

    이것은 단계별로 무엇을 템플릿 클래스 'template_file.php'의

    $template = new Template('template_file.php'); 
    $template->assignVariable('pageTitle', 'Home page'); 
    $template->render(); 
    

    내용 : 기본적인 사용법은 이것이다 assignVariable 메서드가 호출 될 때

  2. render 메서드가 호출 될 때 저장된 변수를 추출하고 템플릿 파일을 ob_start() 및에 포함합니다.블록. 변수 출력을 ob_get_contents()으로 저장하고 저장된 출력을 인쇄합니다.

매우 간단한 템플릿 클래스이지만 예상대로 작동합니다. 질문은 템플릿 파일을 다른 클래스에 위임해야합니까? 이 수업에 단원 시험을 쓸 때이 질문을했습니다. 필자는 파일 시스템 상호 작용을 캡슐화해야한다고 생각했습니다. 어떻게 생각해? 그렇게해서는 안된다고 생각한다면, 테스트에서 파일을 포함하여 어떻게 조롱 할 수 있습니까?

는 어쩌면 난 그냥 같은 클래스에 템플릿 파일의 내용을 전달합니다

$templateContent = file_get_contents('template_file.php'); 
$template = new Template($templateContent); 
... 

편집 : 내가 더 잘 단위 테스트를 작성을 위해 템플릿 클래스의 입력 과정을 캡슐화하기로 결정 캡슐화. 그러나 요하네스가 지적했듯이, 나는 옳지 않은 것처럼 보이는 목적으로 eval()을 사용해야했습니다. 요하네스는 나에게 단위 테스트에서 포함 된 것을 조롱하기위한 스트림 래퍼의 방향으로 지적했다. 그러나 그것은 저에 대한 새로운 아이디어를 얻었습니다. 여기에 내가 할 일이있다. 내 템플릿 클래스에서는 include()을 계속 사용 하겠지만 이번에는 스트림 래퍼를 사용합니다. 초기화하는 동안 프로토콜 처리기를 내 템플릿 클래스에 전달합니다. 이렇게하면 데이터베이스에서 템플릿 데이터를 가져 오거나 로컬 변수를 사용하여 자체 스트림 래퍼를 만들 수 있습니다. 다음은 예제입니다.

$template = new Template('file://template_file.php'); 

stream_wrapper_register('database', 'My_Database_Stream'); 
$template = new Template('database://templates/3'); // templates table, row id 3 

stream_wrapper_register('var', 'My_Var_Stream'); 
$myTemplate = '<?php print "Hello world!"; ?>'; 
$template = new Template('var://myTemplate'); 

로컬 변수에 대한 사용자 정의 스트림 래퍼를 이미 구현했습니다. file_get_contents를 사용하여 내용을 전달함으로써

class My_Var 
{ 
    protected $position; 
    protected $variable; 
    function stream_open($path, $mode, $options, &$openedPath) { 
     $url = parse_url($path); 
     global $$url['host']; 
     $this->variable = $$url['host']; 
     $this->position = 0; 

     return true; 
    } 
    public function stream_read($count) { 
     $ret = substr($this->variable, $this->position, $count); 
     $this->position = strlen($ret); 
     return $ret; 
    } 
    public function stream_eof() { 
     return $this->position >= strlen($this->variable); 
    } 
} 


stream_wrapper_register('var', 'My_Var'); 
$myvar = '<?php print "mert"; ?>'; 
include 'var://myvar'; 
exit; 

답변

0

()와 같은 여러 가지 방법으로 나쁜 실행을 위해 평가()를 사용해야합니다 : 여기있다. 여기서 가장 관련성이 높은 것은 opcode 캐시가 파일을 캐시 할 수 없다는 것입니다. include ('template_file.php'); APC 또는 다른 컴파일 된 스크립트를 캐시하자.

+0

네,하지만 include 함수를 사용할 때, 제 테스트 폴더 내에 더미 템플릿 파일이 필요합니다. 또한 템플릿 클래스 만 테스트하면 안됩니까? 또한 include 함수를 어떻게 조롱합니까? – matte

+0

사용자 정의 스트림 래퍼 또는 조롱 된 데이터를 보내기위한 데이터 공급자를 사용할 수 있습니다. http://php.net/stream_wrapper_register http://php.net/manual/en/wrappers.data.php – johannes

+0

안녕하세요, 요하네스! 당신은 저에 대한 새로운 아이디어를 얻었습니다. 나는 질문을 편집하고 내가 생각해 낸 해결책을 추가했다. – matte

0

질문에 대답하기 위해 eval 대 evil의 악의에 관계없이 솔루션에 대한 I/O 측면을 캡슐화하기 위해 별도의 클래스를 사용하고 동의해야합니다.

이것은 과도한 것처럼 보일 수 있지만 (대부분의 경우에 해당 될 것입니다.), 아마도 이것은 제어/종속성 주입을 제공하는 유일한 방법 일 것입니다.

0

질문은 템플릿 파일을 다른 클래스에 위임해야합니까?

질문은 무엇입니까?

http://www.massassi.com/php/articles/template_engines/

이 방법은 PHP 템플릿 엔진으로 시작한다는 사실을 이용합니다 :

+0

어쩌면 잔인한가요? – matte

+0

"과잉 공격"이 단위 테스트에 대한 답이었던 경우에만. ;) –

+0

과용은 아닙니다. 나는 완전히 내 템플릿 클래스를 캡슐화하는 솔루션을 생각해 냈습니다. 내 질문에 대한 해결책을 추가했습니다. – matte

1

나는 항상이 사람의 접근 방식을 좋아했다. (저자는 실제로 PHP에서 비대해진 템플릿 엔진을 쓰는 것은 어리 석다는 사실에 주목합니다. 실제로 템플릿 엔진입니다.) 직접적으로 여러분의 질문에 답을하지는 못하지만 아마도 도움이 될 것입니다.

+0

내 템플릿 클래스는 그의 템플릿 클래스와 매우 유사합니다. 하지만 내 질문은 파일을 포함하여 캡슐화해야합니까? db에서 검색 한 텍스트를 구문 분석해야하는 경우 어떻게해야합니까? – matte

+0

위의 링크에서 설명한 방법은 Zend Framework에서보기 스크립트가 처리되는 방법으로부터 백만 마일 떨어진 곳이 아닙니다. 뷰 스크립트는 상위 뷰 객체의 컨텍스트에 있으므로 호출을 수행 할 수 있습니다 (일반적으로 플러그인으로 프록시 됨). 예를 들어, 이스케이프를해야 할 때 유용합니다 ( escape ($ this-> var);).) 할 수 있습니다. – berty

관련 문제