Компонент Templating

Компонент Templating

Компонент Templating предоставляет все инструменты, необходимые для востроения любой системы шаблонов.

Он предоставляет инфраструктуру для загрузки файлов шаблона и опционального мониторинга на предмет изменений. Он также предоставляет конкретную реализацию шаблонзатора, используя PHP с дополнительными инструментами для экранизации и разделения шаблонов на блоки и разметки.

Установка

1
$ composer require symfony/templating

Также вы можете клонировать репозиторий https://github.com/symfony/templating.

Note

Якщо ви встановлюєте цей компонент поза додатком Symfony, вам потрібно підключити файл vendor/autoload.phpу вашому коді для включення механізму автозавантаження класів, наданих Composer. Детальніше можна прочитати у цій статті.

Использование

See also

Эта статья объясняет как использовать функции Templating как независимого компонента в любом приложении PHP. Прочитайте статью для понимания как использовать его в приложениях Symfony.

Класс PhpEngine является входной точкой компонента. Ему необходим анализатор имени шаблона (TemplateNameParserInterface) для преобразования имения шаблона в ссылку шаблона (TemplateReferenceInterface). Ему также необходим загрузчик шаблонов (LoaderInterface), который использует ссылку шаблона для поиска и загрузки шаблона:

1
2
3
4
5
6
7
8
9
use Symfony\Component\Templating\PhpEngine;
use Symfony\Component\Templating\TemplateNameParser;
use Symfony\Component\Templating\Loader\FilesystemLoader;

$filesystemLoader = new FilesystemLoader(__DIR__.'/views/%name%');

$templating = new PhpEngine(new TemplateNameParser(), $filesystemLoader);

echo $templating->render('hello.php', array('firstname' => 'Fabien'));
1
2
<!-- views/hello.php -->
Привет, <?php echo $firstname ?>!

Метод render() анализирует файл views/hello.php и возвращает текст вывода. Второй аргумент render - это массив переменных для исползования в шаблоне. В этом примере, результат будет Привет, Фабиен!.

Note

Шаблоны будут кешированы в памяти движка. Это означает, что если вы отображаете один и тот же шаблон несколько раз в одном запросе, он будет загружен из файловой системы единожды.

Переменная $view

Во всех шаблонах, проанализированных PhpEngine, вы получаете доступ к загадочной переменной под названием $view. Эта переменная содержит текущий экземпляр PhpEngine. Это означает, что вы получаете доступ к куче методов, которые облегчают вам жизнь.

Включение шаблонов

Наилучшим способом поделиться частью кода шаблона будет создать шаблон, который может быть включен в другие шаблоны. Так как переменная $view - это экземпляр PhpEngine, то вы можете использовать метод render() (который был использован для отображения шаблона изначально) внутри шаблона, чтобы отобразить другой шаблон:

1
2
3
4
<?php $names = array('Fabien', ...) ?>
<?php foreach ($names as $name) : ?>
    <?php echo $view->render('hello.php', array('firstname' => $name)) ?>
<?php endforeach ?>

Глобальные переменные

Иногда вам может понадобиться установить переменные, которые будут доступны во всех отображенных двигателем шаблонах (например, переменная $app при использовании фреймворка Symfony). Такие переменные можно установить, используя метод addGlobal() и доступ к ним можно получить в шаблоне, как и к обычным переменным:

1
$templating->addGlobal('ga_tracking', 'UA-xxxxx-x');

В шаблоне:

1
<p>Трекинг-код google: <?php echo $ga_tracking ?></p>

Caution

Глобальные переменные не могут быть названы this или view, так как они уже используются в двигателе PHP.

Note

Глобальные переменные можно переопределить локальной переменной в шаблоне с таким же именем.

Экранирование вывода

Когда вы отображаете переменные, вам наверное стоит экранировать их, чтобы код HTML или JavaScript не выписывался с вашей страницы. Это предотвратит, например, XSS-атаки. Чтобы сделать это, используйте метод escape():

1
<?php echo $view->escape($firstname) ?>

По умолчанию, метод escape() предполагает, что переменная выводится в контексте HTML. Второй аргумент позволяет вам изменять контекст. Например, чтобы вывести что-то в JavaScript, используйте контекст js:

1
<?php echo $view->escape($var, 'js') ?>

Компонент поставляется с экранизаторами HTML и JS. Вы можете зарегистрировать ваш собственный экранизатор, используя метод setEscaper():

1
2
3
4
5
$templating->setEscaper('css', function ($value) {
    // ... all CSS escaping

    return $escapedValue;
});

Помощники

Компонент Templating может быть легко расширен с помощью помощников. Помощники - это PHP объекты, которые предоставляют поезные в контексте шаблона функции. Компонент имеет один встроенный помощник:

Перед тем, как вы сможете использовать эти помощники, вам нужно зарегистрировать их, используя set():

1
2
3
4
use Symfony\Component\Templating\Helper\SlotsHelper;
// ...

$templating->set(new SlotsHelper());

Пользовательские помощники

Вы можете создать ваших собственных помощников, создав класс, реализующий HelperInterface. Однако, в большинстве случаев вы будете расширять Helper.

Helper имеет один обязательный метод: getName(). Это имя, которое используется для получения помощника из объекта $view.

Создание ползовательского двигателя

Кроме предоставления шаблонизатора PHP, вы можете также создать ваш собственный двигатель, используя компонент Templating. Чтобы сделать это, создайте новый касс, реализующий EngineInterface. Это требует 3 методов:

Использование нескольких двигателей

Возможно использовать несколько двигателей одновременно, используя класс DelegatingEngine. Этот класс берёт список двигателей и действует так же, как обычный шаблонизатор. Единственная разница - он делегирует вызовы одному из других двигателей. Чтобы выбрать, какой ипользовать для шаблона, используется метод EngineInterface::supports():

1
2
3
4
5
6
7
8
use Acme\Templating\CustomEngine;
use Symfony\Component\Templating\PhpEngine;
use Symfony\Component\Templating\DelegatingEngine;

$templating = new DelegatingEngine(array(
    new PhpEngine(...),
    new CustomEngine(...),
));