在我的模板中,我想输出服务器时区。
我的模板有类似
的内容{{ getservertimezone }}
然后在该捆绑包的services.yml配置中我有
my.twig.extension:
class: My\WebsiteBundle\Extensions\Twig\SomeTemplateHelper
tags:
- { name: twig.extension }
我的SomeTemplateHelper
看起来像
namespace My\WebsiteBundle\Extensions\Twig;
class SomeTemplateHelper extends \Twig_Extension
{
public function getFilters()
{
return array(
'getservertimezone' => new \Twig_Filter_Method($this, 'getServerTimeZone'),
);
}
public function getServerTimeZone()
{
if (date_default_timezone_get()) {
return date_default_timezone_get();
} else if (ini_get('date.timezone')) {
return ini_get('date.timezone');
} else {
return false;
}
}
public function getName()
{
return 'some_helper';
}
}
但我无法调用此方法,除非它像过滤器{{ someval | getservertimezone }}
一样使用,是否可以直接进行直线{{ getservertimezone() }}
调用?
答案 0 :(得分:41)
使用getFunctions()
代替getFilters()
public function getFunctions()
{
return array(
new \Twig_SimpleFunction('server_time_zone', array($this, 'getServerTimeZone')),
);
}
Twig过滤器用于过滤某些值。
{{ "some value" | filter_name_here }}
顺便说一下,你可以在同一个类中定义过滤器和函数。
答案 1 :(得分:6)
而不是getFilters
,覆盖getFunctions
并使用Twig_Function_Method
代替Twig_Filter_Method
。
答案 2 :(得分:6)
在较新版本的Twig中,他应该使用Twig_SimpleFunction而不是Twig_Function_Method和Twig_SimpleFilter而不是Twig_Filter_Method,因为弃用了Twig _ * _ Method(我使用的是Twig v.1.24.0和Symfony 2.8.2)
答案 3 :(得分:0)
请参见下面的示例
namespace Your/NameSpace;
class AppExtension extends \Twig_Extension {
public function getFilters()
{
return array(
new \Twig_SimpleFilter('cdn_asset_filter', array($this, 'cdn_asset_filter')),
);
}
public function getFunctions()
{
return array(
new \Twig\TwigFunction('cdn_asset_function', array($this, 'cdn_asset_function')),
);
}
public function cdn_asset_filter($path)
{
return "https://cdn.example.com/$path";
}
public function cdn_asset_function($path)
{
return "https://cdn.example.com/$path";
}
}
// Filter
<img src="{{ 'path/to/image.png'|cdn_asset_filter }}">
// result : <img src="https://cdn.example.com/path/to/image.png">
// Function
<img src="{{ cdn_asset_function('path/to/image.png') }}">
// result : <img src="https://cdn.example.com/path/to/image.png">
services:
my_global_filters_and_functions:
class: Your/NameSpace/AppExtension
tags:
- { name: twig.extension }
这就是我在旧项目中的Twig中使用自定义函数的方式,我不知道这是否是最佳实践,但这对我有用。
资源:Twig文档-Extending Twig