Cover of the book Symfony 5: The Fast Track

Symfony 5: The Fast Track is the best book to learn modern Symfony development, from zero to production. +300 pages in full color showing how to combine Symfony with Docker, APIs, queues & async tasks, Webpack, Single-Page Applications, etc.

Buy printed version
WARNING: You are browsing the documentation for Symfony 2.8 which is not maintained anymore. Consider upgrading your projects to Symfony 5.1.

The Templating Component

2.8 version
Maintained Unmaintained

The Templating Component

The Templating component provides all the tools needed to build any kind of template system.

It provides an infrastructure to load template files and optionally monitor them for changes. It also provides a concrete template engine implementation using PHP with additional tools for escaping and separating templates into blocks and layouts.


$ composer require symfony/templating

Alternatively, you can clone the repository.


If you install this component outside of a Symfony application, you must require the vendor/autoload.php file in your code to enable the class autoloading mechanism provided by Composer. Read this article for more details.


See also

This article explains how to use the Templating features as an independent component in any PHP application. Read the Creating and Using Templates article to learn about how to work with templates in Symfony applications.

The Symfony\Component\Templating\PhpEngine class is the entry point of the component. It needs a template name parser (Symfony\Component\Templating\TemplateNameParserInterface) to convert a template name to a template reference (Symfony\Component\Templating\TemplateReferenceInterface). It also needs a template loader (Symfony\Component\Templating\Loader\LoaderInterface) which uses the template reference to actually find and load the template:

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'));
<!-- views/hello.php -->
Hello, <?php echo $firstname ?>!

The render() method parses the views/hello.php file and returns the output text. The second argument of render is an array of variables to use in the template. In this example, the result will be Hello, Fabien!.


Templates will be cached in the memory of the engine. This means that if you render the same template multiple times in the same request, the template will only be loaded once from the file system.

The $view Variable

In all templates parsed by the PhpEngine, you get access to a mysterious variable called $view. That variable holds the current PhpEngine instance. That means you get access to a bunch of methods that make your life easier.

Including Templates

The best way to share a snippet of template code is to create a template that can then be included by other templates. As the $view variable is an instance of PhpEngine, you can use the render() method (which was used to render the template originally) inside the template to render another template:

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

Global Variables

Sometimes, you need to set a variable which is available in all templates rendered by an engine (like the $app variable when using the Symfony Framework). These variables can be set by using the addGlobal() method and they can be accessed in the template as normal variables:

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

In a template:

<p>The google tracking code is: <?php echo $ga_tracking ?></p>


The global variables cannot be called this or view, since they are already used by the PHP engine.


The global variables can be overridden by a local variable in the template with the same name.

Output Escaping

When you render variables, you should probably escape them so that HTML or JavaScript code isn’t written out to your page. This will prevent things like XSS attacks. To do this, use the escape() method:

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

By default, the escape() method assumes that the variable is outputted within an HTML context. The second argument lets you change the context. For example, to output something inside JavaScript, use the js context:

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

The component comes with an HTML and JS escaper. You can register your own escaper using the setEscaper() method:

$templating->setEscaper('css', function ($value) {
    // ... all CSS escaping

    return $escapedValue;


The Templating component can be easily extended via helpers. Helpers are PHP objects that provide features useful in a template context. The component has 2 built-in helpers:

Before you can use these helpers, you need to register them using set():

use Symfony\Component\Templating\Helper\AssetsHelper;
// ...

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

Custom Helpers

You can create your own helpers by creating a class which implements Symfony\Component\Templating\Helper\HelperInterface. However, most of the time you’ll extend Symfony\Component\Templating\Helper\Helper.

The Helper has one required method: getName(). This is the name that is used to get the helper from the $view object.

Creating a Custom Engine

Besides providing a PHP templating engine, you can also create your own engine using the Templating component. To do that, create a new class which implements the Symfony\Component\Templating\EngineInterface. This requires 3 method:

Using Multiple Engines

It is possible to use multiple engines at the same time using the Symfony\Component\Templating\DelegatingEngine class. This class takes a list of engines and acts just like a normal templating engine. The only difference is that it delegates the calls to one of the other engines. To choose which one to use for the template, the EngineInterface::supports() method is used:

use Acme\Templating\CustomEngine;
use Symfony\Component\Templating\PhpEngine;
use Symfony\Component\Templating\DelegatingEngine;

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

This work, including the code samples, is licensed under a Creative Commons BY-SA 3.0 license.