Я пишу базовый класс шаблонов для своего собственного проекта. Основное применение заключается в следующем:Как смоделировать класс шаблонов
$template = new Template('template_file.php');
$template->assignVariable('pageTitle', 'Home page');
$template->render();
Содержание «template_file.php»:
<?php print $pageTitle; ?>
Это то, что шаблонный класс делает шаг за шагом:
- магазины переменных в частном массиве когда метод assignVariable вызывается
- Когда вызывается метод render, извлекает сохраненные переменные, включает файл шаблона в
ob_start()
иob_end_clean()
блок. Сохраняет вывод в переменной сob_get_contents()
, а затем печатает сохраненный вывод.
Я знаю, что это очень простой шаблон шаблонов, но работает так, как ожидалось. Вопрос в том, должен ли я делегировать файл шаблона в другой класс? У меня был этот вопрос, когда я писал модульные тесты для этого класса. Я думал, что взаимодействие файловой системы должно быть инкапсулировано. Как вы думаете? Если вы считаете, что это не так, как я могу издеваться над файлом в моих тестах?
Может быть, я просто передать содержимое файла шаблона в класс, как это:
$templateContent = file_get_contents('template_file.php');
$template = new Template($templateContent);
...
Edit: я решил инкапсулировать процесс ввода класса шаблона для написания более модульных тестов и инкапсулирование. Но, как указал Йоханнес, мне нужно было использовать 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');
У меня уже есть пользовательская потоковая оболочка для локальных переменных. Вот оно:
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