Компонент Templating

Дата оновлення перекладу 2023-06-16

Компонент 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. 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) {
    // ... екранування всього CSS

    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(...),
));