Что использовать вместо Twig_Loader_String
Я вижу, что класс Twig_Loader_String
устарел и будет удален в Twig 2.0. Кроме того, комментарии в источнике указывают, что он должен "НИКОГДА не использоваться".
Существует множество допустимых вариантов использования для строки, содержащей шаблон Twig.
Вопрос: что использовать вместо этого?
Ответы
Ответ 1
$tplName = uniqid( 'string_template_', true );
$env = clone $this->getTwig();
$env->setCache(false);
$env->setLoader( new \Twig_Loader_Array( [ $tplName => 'Hello, {{ name }}' ] ));
$html = new Response( $env->render( $tplName, [ 'name' => 'Bob' ] ));
echo $html; // Hello, Bob
Ответ 2
Twig_Environment#createTemplate
, как указано в проблема, обесценивающая Twig_Loader_String
:
// the loader is not important, you can even just
// use the twig service in Symfony here
$twig = new \Twig_Environment(...);
$template = $twig->createTemplate('Hello {{ name }}!');
echo $template->render(['name' => 'Bob']);
Этот код является самым простым способом и обходит всю систему кэширования. Это означает, что у него нет плохих вещей Twig_Loader_String
(он не создает новую запись кэша при каждом вызове render
, у нее нет проблем с ссылкой на другие шаблоны и т.д.), Но это все еще не так быстро, как использование Twig_Loader_Array
(как показано в ответе @AlainTiemblo) или Twig_Loader_Filesystem
.
Ответ 3
Загружатель Twig_Loader_Array
принимает массив $templateName => $templateContents
в качестве аргумента, поэтому некоторые элементы кеша могут быть сделаны с использованием имени шаблона.
Итак, эта реализация работает:
$templates = array('hello' => 'Hello, {{ name }}');
$env = new \Twig_Environment(new \Twig_Loader_Array($templates));
echo $env->render('hello', array('name' => 'Bob'));
Или:
$env = new \Twig_Environment(new \Twig_Loader_Array(array()));
$template = $env->createTemplate('Hello, {{ name }}');
echo $template->render(array('name' => 'Bob'));
Чтобы прояснить слух, с самой первой версии Twig, Twig_Loader_Array
принимает массив в свой конструктор. Все ответы, инициализирующие Twig_Loader_Array
без массива, неверны.
Ответ 4
Попробуйте
$template = $this->container->get('twig')->createTemplate('hello {{ name }}');
echo $template->render(array('name' => 'Fabien'));
Ответ 5
$environment = new \Twig_Environment(new \Twig_Loader_Array(array()));
$template = $environment->createTemplate('{{ template }} {{ replacements }}');
echo $template->render([replacements]);
Ответ 6
Лучшее:
http://twig.sensiolabs.org/doc/2.x/recipes.html#loading-a-template-from-a-string
В качестве примера, используемого мной:
public function parse($content, $maxLoops = 3, $context = array())
{
if (strlen($content) < 1) {
return null;
}
for ($i = 0; $i < $maxLoops; $i++) {
$template = $this->container->get('twig')->createTemplate($content);
$result = $template->render( $context );
if ($result == $content) {
break;
} else {
$content = $result;
}
}
return $content;
}
Ответ 7
Это похоже на работу, как ожидалось:
$tplName = uniqid( 'string_template_', true );
$env = clone $this->getTwig();
$env->setLoader( new \Twig_Loader_Array( [ $tplName => 'Hello, {{ name }}' ] ));
$html = new Response( $env->render( $tplName, [ 'name' => 'Bob' ] ));
$cacheName = $env->getCacheFilename( $tplName );
if( is_file( $cacheName ) )
{
unlink( $cacheName );
}
echo $html; // Hello, Bob
Я нашел подсказки здесь: http://twig.sensiolabs.org/doc/recipes.html#using-different-template-sources.
Обратите внимание, что удаление файла кэша нежелательно, если строка шаблона поступает из базы данных или чего-то подобного. Я использую эту функцию для создания шаблонов, которые создаются динамически и имеют очень короткие промежутки времени, обычно при отладке и тестировании.