私のテンプレートでは、サーバーのタイムゾーンを出力します。
私のテンプレートには次のようなものがあります
{{ 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() }}
呼び出しを行う方法はありますか?
getFunctions()
の代わりにgetFilters()
を使用します
public function getFunctions()
{
return array(
new \Twig_SimpleFunction('server_time_zone', array($this, 'getServerTimeZone')),
);
}
Twigフィルターは、値をフィルタリングするために使用されます。
{{ "some value" | filter_name_here }}
ところで、同じクラスでフィルターと関数の両方を定義できます。
getFilters
の代わりに、getFunctions
をオーバーライドし、Twig_Function_Method
の代わりに Twig_Filter_Method
。
Twigの新しいバージョンでは、Twig _ * _ Methodは廃止されているため、Twig_Function_Methodの代わりにTwig_SimpleFunctionを使用し、Twig_Filter_Methodの代わりにTwig_SimpleFilterを使用する必要があります(私はTwig v 。1.24.0とSymfony 2.8.2)
以下の例を参照してください
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 Documentation- Extending Twig