在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] 
      ) 
     ]; 
    } 
}