不使用自定义控制器时如何渲染模板

3.4 版本
维护中的版本

通常当你需要去创建一个页面,你需要去创建一个控制器并在控制器内渲染一个模板。但如果你渲染一个简单的模板,这个模板不需要传递任何的数据,你完全可以不去创建控制器,你可以直接使用内置的FrameworkBundle:Template:template控制器。

例如,假设你要去渲染一个static/privacy.html.twig模板,这个模板不需要传递任何的变量。那么你毋需创建一个控制器:

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;

你传递的任何模板都会作为这个template的默认值,直接被FrameworkBundle:Template:template控制器渲染。

当然,你也可以使用这个技巧,在模板里渲染嵌入式控制器( embedded controllers)。但是,由于在模板内渲染控制器通常的目的是——在自定义的控制器中准备一些数据,这可能仅在你希望缓存页面局部时有用(把静态模板进行缓存)。

1
{{ render(url('acme_privacy')) }}
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())
) ?>

把静态模板进行缓存 

由于以这种方式呈现的模板通常是静态的,缓存它们可能更有意义。幸运的是,这是容易的!在你的路由中配置一些额外的变量,你就可以精确控制页面该如何被缓存了:

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;

MaxAgesharedAge 的值用于修改在控制器中创建的响应(Response )对象。更多缓存的详细信息请看HTTP缓存

还有一个private变量(这里没有显示)。默认情况下,只要传递了maxAgesharedAge,Response响应对象就是公有的。如果设置privatetrue,Response对象将被标记为私有。

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)