如何写一个自定义的Twig扩展

3.4 版本
维护中的版本

写扩展的主要目的就是把经常用到的代码移植到一个可重用的类中,比如说添加国际化支持。扩展可以定义(标签)tag,(筛选)filters,(测试)tests,(运算符)operators,(全局变量)global variables,(函数)functions 和(访问节点)node visitors。

创建一个扩展也有助于更好的代码分离,此处的代码包括编译时和运行时所需的代码。因此,它使你的代码更快。

在编写自己的扩展之前,看一看Twig管方扩展库

创建扩展类 

本文描述了如何去写一个自定义的Twig扩展( Twig 1.12以后的版本)。如果你使用旧版本,请阅读 弃用的Twig扩展文档

你想使用你的自定义功能,你一定要首先创建一个自定义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
// src/AppBundle/Twig/AppExtension.php
namespace AppBundle\Twig;
 
class AppExtension extends \Twig_Extension
{
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('price', array($this, 'priceFilter')),
        );
    }
 
    public function priceFilter($number, $decimals = 0, $decPoint = '.', $thousandsSep = ',')
    {
        $price = number_format($number, $decimals, $decPoint, $thousandsSep);
        $price = '$'.$price;
 
        return $price;
    }
 
    public function getName()
    {
        return 'app_extension';
    }
}

除了自定义过滤器,您还可以添加自定义函数和注册全局变量。

注册一个扩展为服务 

现在,你必须让服务容器知道你新创建了Twig扩展:

1
2
3
4
5
6
7
# app/config/services.yml
services:
    app.twig_extension:
        class: AppBundle\Twig\AppExtension
        public: false
        tags:
            - { name: twig.extension }
1
2
3
4
5
6
7
8
<!-- app/config/services.xml -->
<services>
    <service id="app.twig_extension"
        class="AppBundle\Twig\AppExtension"
        public="false">
        <tag name="twig.extension" />
    </service>
</services>
1
2
3
4
5
6
7
// app/config/services.php
use Symfony\Component\DependencyInjection\Definition;
 
$container
    ->register('app.twig_extension', '\AppBundle\Twig\AppExtension')
    ->setPublic(false)
    ->addTag('twig.extension');

使用自定义的扩展 

使用您新创建的 Twig 扩展和使用其他扩展没有什么不同:

1
2
{# outputs $5,500.00 #}
{{ '5500'|price }}

传入其他参数到你的过滤器:

1
2
{# outputs $5500,2516 #}
{{ '5500.25155'|price(4, ',', '') }}

进一步学习 

如果想深入了解Twig扩展,参考 Twig extensions文档

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

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