How to Render a Template without a custom Controller
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:
- YAML
1 2 3 4 5
acme_privacy: path: /privacy defaults: _controller: FrameworkBundle:Template:template template: static/privacy.html.twig
- XML
1 2 3 4 5 6 7 8 9 10
<?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>
- PHP
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 Caching the static Template).
- Twig
1
{{ render(url('acme_privacy')) }}
- PHP
1 2 3 4 5 6 7 8 9 10
<?php use Symfony\Component\Routing\Generator\UrlGeneratorInterface; ?> <!-- The url() method was introduced in Symfony 2.8. Prior to 2.8, you had to use generate() with UrlGeneratorInterface::ABSOLUTE_URL passed as the third argument. --> <?php echo $view['actions']->render( $view['router']->url('acme_privacy', array()) ) ?>
Caching the static Template¶
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:
- YAML
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
- XML
1 2 3 4 5 6 7 8 9 10 11 12
<?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>
- PHP
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.
This work, including the code samples, is licensed under a Creative Commons BY-SA 3.0 license.