不使用自定义控制器时如何渲染模板
通常当你需要去创建一个页面,你需要去创建一个控制器并在控制器内渲染一个模板。但如果你渲染一个简单的模板,这个模板不需要传递任何的数据,你完全可以不去创建控制器,你可以直接使用内置的FrameworkBundle:Template:template
控制器。
例如,假设你要去渲染一个static/privacy.HTML.twig
模板,这个模板不需要传递任何的变量。那么你毋需创建一个控制器:
|
acme_privacy:
path: /privacy
defaults:
_controller: FrameworkBundle:Template:template
template: static/privacy.html.twig |
|
<?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> |
|
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; |
你传递的任何模板都会作为这个template
的默认值,直接被FrameworkBundle:Template:template
控制器渲染。
当然,你也可以使用这个技巧,在模板里渲染嵌入式控制器( embedded controllers)。但是,由于在模板内渲染控制器通常的目的是——在自定义的控制器中准备一些数据,这可能仅在你希望缓存页面局部时有用(把静态模板进行缓存)。
|
{{ render(url('acme_privacy')) }} |
|
<?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())
) ?> |
把静态模板进行缓存 ¶
由于以这种方式呈现的模板通常是静态的,缓存它们可能更有意义。幸运的是,这是容易的!在你的路由中配置一些额外的变量,你就可以精确控制页面该如何被缓存了:
|
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; |
MaxAge
和 sharedAge
的值用于修改在控制器中创建的响应(Response )对象。更多缓存的详细信息请看HTTP缓存。
还有一个private
变量(这里没有显示)。默认情况下,只要传递了maxAge
和 sharedAge
,Response响应对象就是公有的。如果设置private
为true
,Response对象将被标记为私有。