模板

3.3 版本
维护中的版本

当PHP于20年前被创建的时候,开发者喜欢它的简洁以及可以混同HTML生成动态内容。时过境迁,其他模板语言 - 比如Twig - 正令模板创建过程变得更好。

Best Practice

Best Practice

使用Twig格式的模板作为你的模板引擎。

总地来说,PHP的模板体系极度臃肿,跟Twig引擎相比它缺少许多现代模板应当具备的原生支持,比如继承、自动escape以及变量调节和模板函数等。

Twig是Symfony默认的引擎,它在全部“非PHP原生模板引擎”中拥有最大的社区支持(被用于高知名度项目比如Drupal8中)。

除此之外,Twig也是唯一受Symfony 3.0支持的模板格式。说起来,PHP官方有可能取消对原生模板引擎的支持。

模板的位置 

Best Practice

Best Practice

把你的程序所有模板存放于app/Resources/views/目录中。

传统上,Symfony开发者将程序模板存放在每个bundle的Resources/views/目录下。然后他们会用逻辑名称来引用这些模板(比如AcmeDemoBundle:Default:index.html.twig)。

但对于你的程序来说,更方便的作法是把模板放在app/Resources/views/目录中。对于初学者来说,这可以大幅简化模板的逻辑名称:

Templates Stored inside Bundles Templates Stored in app/
AcmeDemoBundle:Default:index.html.twig default/index.html.twig
::layout.html.twig layout.html.twig
AcmeDemoBundle::index.html.twig index.html.twig
AcmeDemoBundle:Default:subdir/index.html.twig default/subdir/index.html.twig
AcmeDemoBundle:Default/subdir:index.html.twig default/subdir/index.html.twig

另一个好处在于,中心化你的模板可以令设计师减轻工作负担。他们毋须在海量的分散在各处的bundles里面寻找模板。

Best Practice

Best Practice

对模板及其所在目录,请使用小写的蛇型连接法来命名,比如snake_case。

Twig扩展 

Best Practice

Best Practice

将定义Twig Extension的文件放在AppBundle/Twig/目录下,并使用app/config/services.yml文件配置它们。

我们的程序需要一个md2html变量调节器,这样我们就可以转换每一贴的MarkDown内容为HTML。

要实现这个,先安装极为出色的Parsedown MarkDown解析器,它是我们项目的依赖:

1
$  composer require erusev/parsedown

然后创建一个新的MarkDown服务,我们在Twig extension中要用到。服务定义仅用到类的路径:

1
2
3
4
5
# app/config/services.yml
services:
    # ...
    markdown:
        class: AppBundle\Utils\Markdown

Markdown类里只有一个方法用于转换MarkDown内容到HTML:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace AppBundle\Utils;
 
class Markdown
{
    private $parser;
 
    public function __construct()
    {
        $this->parser = new \Parsedown();
    }
 
    public function toHtml($text)
    {
        $html = $this->parser->text($text);
 
        return $html;
    }
}

接下来,要创建Twig扩展了。定义一个名为md2html的filter(变量调节器)要用到Twig_SimpleFilter类。注入markdown服务到这个Twig扩展类的构造器中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
namespace AppBundle\Twig;
 
use AppBundle\Utils\Markdown;
 
class AppExtension extends \Twig_Extension
{
    private $parser;
 
    public function __construct(Markdown $parser)
    {
        $this->parser = $parser;
    }
 
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter(
                'md2html',
                array($this, 'markdownToHtml'),
                array('is_safe' => array('html'))
            ),
        );
    }
 
    public function markdownToHtml($content)
    {
        return $this->parser->toHtml($content);
    }
 
    public function getName()
    {
        return 'app_extension';
    }
}

最后我们要定义一个新服务,以便这个Twig extension能够在程序中使用(服务的名称无所谓,因为你在代码中根本用不到它):

1
2
3
4
5
6
7
8
# app/config/services.yml
services:
    app.twig.app_extension:
        class:     AppBundle\Twig\AppExtension
        arguments: ['@markdown']
        public:    false
        tags:
            - { name: twig.extension }

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

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