나는 내 자신의 프로젝트를위한 기본 템플릿 클래스를 작성 중이다. 개인 배열템플릿 클래스를 모델하는 방법
- 상점 변수 :
<?php print $pageTitle; ?>
이것은 단계별로 무엇을 템플릿 클래스 'template_file.php'의
$template = new Template('template_file.php'); $template->assignVariable('pageTitle', 'Home page'); $template->render();
내용 : 기본적인 사용법은 이것이다 assignVariable 메서드가 호출 될 때
- 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;
네,하지만 include 함수를 사용할 때, 제 테스트 폴더 내에 더미 템플릿 파일이 필요합니다. 또한 템플릿 클래스 만 테스트하면 안됩니까? 또한 include 함수를 어떻게 조롱합니까? – matte
사용자 정의 스트림 래퍼 또는 조롱 된 데이터를 보내기위한 데이터 공급자를 사용할 수 있습니다. http://php.net/stream_wrapper_register http://php.net/manual/en/wrappers.data.php – johannes
안녕하세요, 요하네스! 당신은 저에 대한 새로운 아이디어를 얻었습니다. 나는 질문을 편집하고 내가 생각해 낸 해결책을 추가했다. – matte