Компонент Шаблонизация

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

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

Установка

Вы можете установить компонент 2 разными способами:

Then, require the vendor/autoload.php file to enable the autoloading mechanism provided by Composer. Otherwise, your application won't be able to find the classes of this Symfony component.

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

Класс 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;

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

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

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;
});

Помощники

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

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

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

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

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

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

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

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

Кроме предоставления шаблонизатора PHP, вы можете также создать ваш собственный двигатель, используя компонент Шаблонизация. Чтобы сделать это, создайте новый касс, реализующий 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(...),
));

Узнать больше

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.