如何写一个自定义的Twig扩展
写扩展的主要目的就是把经常用到的代码移植到一个可重用的类中,比如说添加国际化支持。扩展可以定义(标签)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文档。