在symfony2中的另一个过滤器树枝内使用过滤器
问题描述:
我需要知道如何从另一个过滤器获取过滤器,我有下一个代码。也许我必须使用Twig_Enviroment,但我不知道如何。在symfony2中的另一个过滤器树枝内使用过滤器
的理念是:
- 过滤器上的转换在字的数目。这个做完了。
-
过滤器B应使用过滤器A将货币值转换为单词。
类CurrencyToWordsExtension延伸\ Twig_Extension { 公共函数getFilters() { 返回阵列( 新\ Twig_SimpleFilter( 'currencyToWords',阵列($此, 'currencyToWordsFilter')) ); }
function currencyToWordsFilter($number) { // $toWords = $env->getFilter('toWords'); $number = number_format((float)$number, 2); $pesos = floor($number); $centavos = ($number - $pesos) * 100; return $pesos .' con '. $centavos; } public function getName() { return 'currencyToWords'; }
}
答
有很多的可能性:从过滤器中分离的类
- 搬出逻辑。过滤器应该是复杂逻辑的轻度包装。
- 将两个过滤器都移动到同一个Twig Extension类中(如果它们很简单并且都是您的代码)。然后你可以调用内部类的方法。
- 依赖注入枝条扩展类的构造函数中services.yml
services.yml
services:
twig.currency_extension:
class: AppBundle\Twig\CurrencyExtension
public: false
arguments: [ '@twig.words_extension' ]
tags:
- { name: twig.extension }
CurrencyExtension.php
class CurreycExtension extends Twig_Extension
{
/** @var WordsExtension */
private $wordsExtension;
public __construct(WordsExtension $wordsExtension)
{
$this->wordsExtension = $wordsExtension
}
//...
}
也可以尝试根据命名过滤器树枝约定:snake_case,简称。
答
class SomeExtension extends \Twig_Extension {
function getName() {
return 'some_extension';
}
function getFilters() {
return [
new \Twig_SimpleFilter(
'filterOne',
function(\Twig_Environment $env, $input) {
$output = dosmth($input);
$filter2Func = $env->getFilter('otherFiltersName')->getCallable();
$output = call_user_func($filter2Func, $output);
return $output;
},
['needs_environment' => true]
)
];
}
}