在Symfony2中添加Twig是个非常简单的事情,在安装sonata-media-bundle的时候 , 发现dev版本没有看到一个叫"number_format_decimal"的扩展 , 结果会出现
The filter "number_format_decimal" does not exist in SonataMediaBundle:MediaAdmin:edit.html.twig at line 54
的报错。stackoverflow没找到原因。所以还不如写个简单的twig extension.
首先在当前项目的Bundle下创建一个Twig目录 然后添加Extension文件 :
// src/Demo/ExtensionBundle/Twig/Extension.php
namespace Demo\ExtensionBundle\Twig;
class Extension extends \Twig_Extension
{
public function getFilters()
{
return array(
//第一个参数是Twig中使用的Filter名 : 比如 {{ foo | number_format_decimal }} 这样foo会作为参数传递过来
//第二个参数是个回调 调用下面编写的Filter方法
new \Twig_SimpleFilter('number_format_decimal', array($this, 'number_format_decimal_Filter')),
);
}
public function number_format_decimal_Filter($number)
{
//这里是你的Filter
return number_format( $number);
}
public function getName()
{
return 'demo_extension';
}
}
然后在Resources/config/service.yml添加service :
services:
demo.twig.extension:
class: Demo\ExtensionBundle\Twig\Extension
tags:
- { name: twig.extension }
刷新那个报错的页面 或者 在twig中用 “number_format_decimal”就ok了。
这里要注意的是依赖的服务的Scope , 比如 Request , 否则可能会出现 CircularReferenceException或者ScopeWideningInjectionException 异常.
关于Scope :
http://symfony.com/doc/current/cookbook/service_container/scopes.html