【问题标题】:Use filter inside another filter twig in symfony2在 symfony2 的另一个过滤器树枝中使用过滤器
【发布时间】:2016-08-16 18:44:50
【问题描述】:

我需要知道如何从另一个过滤器中获取一个过滤器,我有下一个代码。也许我必须使用 Twig_Enviroment,但我不会。

想法是:

  • 过滤器 A 将数字转换为单词。这个做完了。
  • 过滤器 B 应该使用过滤器 A 将货币值转换为单词。

    类 CurrencyToWordsExtension 扩展 \Twig_Extension { 公共函数 getFilters() { 返回数组( 新 \Twig_SimpleFilter('currencyToWords', 数组($this, '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';
    }
    

    }

【问题讨论】:

    标签: symfony twig


    【解决方案1】:
    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]
                )
            ];
        }
    }
    

    【讨论】:

      【解决方案2】:

      有很多可能性:

      • 将过滤器中的逻辑移到单独的类中。过滤器应该是复杂逻辑的轻包装。
      • 将两个过滤器移动到同一个 Twig 扩展类中(如果它们很简单并且都是您的代码)。然后就可以调用内部类方法了。
      • 将依赖项注入到 services.yml 中的 Twig Extension 类构造函数中

      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
          }
      
          //...
      }
      

      还可以尝试根据 twig 约定命名过滤器:snake_case,short。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多