How to Render a Template without a custom Controller
Edit this pageWarning: You are browsing the documentation for Symfony 2.3, which is no longer maintained.
Read the updated version of this page for Symfony 7.0 (the current stable version).
How to Render a Template without a custom Controller
Usually, when you need to create a page, you need to create a controller
and render a template from within that controller. But if you're rendering
a simple template that doesn't need any data passed into it, you can avoid
creating the controller entirely, by using the built-in FrameworkBundle:Template:template
controller.
For example, suppose you want to render a static/privacy.html.twig
template, which doesn't require that any variables are passed to it. You
can do this without creating a controller:
1 2 3 4 5
acme_privacy:
path: /privacy
defaults:
_controller: FrameworkBundle:Template:template
template: static/privacy.html.twig
1 2 3 4 5 6 7 8 9 10 11
<?xml version="1.0" encoding="UTF-8" ?>
<routes xmlns="http://symfony.com/schema/routing"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
<route id="acme_privacy" path="/privacy">
<default key="_controller">FrameworkBundle:Template:template</default>
<default key="template">static/privacy.html.twig</default>
</route>
</routes>
1 2 3 4 5 6 7 8 9 10
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
$collection = new RouteCollection();
$collection->add('acme_privacy', new Route('/privacy', array(
'_controller' => 'FrameworkBundle:Template:template',
'template' => 'static/privacy.html.twig',
)));
return $collection;
The FrameworkBundle:Template:template
controller will simply render whatever
template you've passed as the template
default value.
You can of course also use this trick when rendering embedded controllers from within a template. But since the purpose of rendering a controller from within a template is typically to prepare some data in a custom controller, this is probably only useful if you'd like to cache this page partial (see How to Render a Template without a custom Controller).
1
{{ render(url('acme_privacy')) }}
1 2 3 4 5 6 7
<?php
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
?>
<?php echo $view['actions']->render(
$view['router']->generate('acme_privacy', array(), UrlGeneratorInterface::ABSOLUTE_URL)
) ?>
Caching the static Template
2.2
The ability to cache templates rendered via FrameworkBundle:Template:template
was introduced in Symfony 2.2.
Since templates that are rendered in this way are typically static, it might make sense to cache them. Fortunately, this is easy! By configuring a few other variables in your route, you can control exactly how your page is cached:
1 2 3 4 5 6 7
acme_privacy:
path: /privacy
defaults:
_controller: FrameworkBundle:Template:template
template: 'static/privacy.html.twig'
maxAge: 86400
sharedAge: 86400
1 2 3 4 5 6 7 8 9 10 11 12 13
<?xml version="1.0" encoding="UTF-8" ?>
<routes xmlns="http://symfony.com/schema/routing"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
<route id="acme_privacy" path="/privacy">
<default key="_controller">FrameworkBundle:Template:template</default>
<default key="template">static/privacy.html.twig</default>
<default key="maxAge">86400</default>
<default key="sharedAge">86400</default>
</route>
</routes>
1 2 3 4 5 6 7 8 9 10 11 12
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
$collection = new RouteCollection();
$collection->add('acme_privacy', new Route('/privacy', array(
'_controller' => 'FrameworkBundle:Template:template',
'template' => 'static/privacy.html.twig',
'maxAge' => 86400,
'sharedAge' => 86400,
)));
return $collection;
The maxAge
and sharedAge
values are used to modify the Response
object created in the controller. For more information on caching, see
HTTP Cache.
There is also a private
variable (not shown here). By default, the Response
will be made public, as long as maxAge
or sharedAge
are passed.
If set to true
, the Response will be marked as private.