【问题标题】:How to Call Static Function In Symfony2 Twig Template如何在 Symfony2 Twig 模板中调用静态函数
【发布时间】:2015-10-03 07:49:24
【问题描述】:

如何在不通过控制器的情况下在树枝模板中调用我的静态函数?

例如:

...
{{ MyStaticClass::getData() }}
...

我的静态类:

class MyStaticClass {
    const v1 = 'Value1';
    const v2 = 'Value2';
    ...

    public static function getData() {
        ...

        return $data;
    }
}

【问题讨论】:

    标签: php symfony static twig


    【解决方案1】:

    有时可以简单地使用静态方法将类的新实例传递给 twig,而不是编写 Twig 扩展。

    例如

    // ...
    $viewVars['MyStaticClass'] = new MyStaticClass();
    // ...
    $html = $twig->render('myTemplate.html.twig', $viewVars);
    

    在树枝上:

    {{ MyStaticClass.getData() }}
    

    【讨论】:

      【解决方案2】:

      您不能在 twig 模板中直接调用 PHP。您需要创建一个过滤器或函数来执行您正在查找的操作。

      $twig         = new Twig_Environment($loader, $params);
      $twigFunction = new Twig_SimpleFunction('MyStaticClass', function($method) {
          MyStaticClass::$method
      });
      $twig->addFunction($twigFunction);
      

      然后在你的树枝模板中做:

      {{ MyStaticClass('getData') }}
      

      当然,上面的例子假设MyStaticClass 在你所在的地方的范围内。

      Symfony 示例

      您必须创建树枝扩展。下面的例子:

      namespace PurpleNeve\Web\PNWebBundle\Extensions;
      
      use PurpleNeve\Web\PNWebBundle\DependencyInjection\CurrencyConverter;
      
      class TwigCurrency extends \Twig_Extension
      {
          private $converter;
      
          public function __construct(CurrencyConverter $converter)
          {
            $this->converter = $converter;
          }
      
          public function getName()
          {
              return 'currency';
          }
      
          public function getFilters()
          {
              return array(
                  'convertCurrency' => new \Twig_Filter_Method($this, 'getConversionBetween')
              );
          }
      
          public function getConversionBetween($amount, $isoFrom, $isoTo="USD")
          {
              try {
                $value = $this->converter->convertAmount($amount, $isoFrom, $isoTo);
                return round($value,2);
              } catch(\Exception $e) {
                return "?";
              }
          }
      }
      

      这是我创建的扩展程序示例,用于在 twig 中将货币从一种货币转换为另一种货币。

      要实现它,你需要在你的 services.yml 中为它创建一个服务对象

      parameters:
          currency_converter.class: PurpleNeve\Web\PNWebBundle\DependencyInjection\CurrencyConverter
      
      services:
          currency_converter:
              class: "%currency_converter.class%"
              arguments : [@doctrine.orm.entity_manager]
      
          twig.extension.currency:
              class: PurpleNeve\Web\PNWebBundle\Extensions\TwigCurrency
              tags:
                  - { name: 'twig.extension' }
              arguments : [ @currency_converter ]
      

      然后如上所述,在 twig 中,我可以使用 {{ convertCurrency(55505, 'CAD', 'USD) }} 调用该类和函数

      【讨论】:

      • 我明白了,在哪里添加上面的代码?你指的“在你所指的范围内”是什么?
      • 呈现你的树枝模板的任何文件。在渲染之前添加该代码。
      • 在范围内意味着,您的类可以从您声明上述代码的位置访问/调用。
      • 你的意思是我的控制器就在我调用渲染之前?
      • 我添加了一个扩展示例,我必须在我的一个项目中为 twig 编写以转换货币。
      【解决方案3】:

      一种通用的方法是注册一个名为 callstatic 的 Twig 辅助函数来进行调用。

      $twig->addFunction(new \Twig_SimpleFunction('callstatic', function ($class, $method, ...$args) {
          if (!class_exists($class)) {
              throw new \Exception("Cannot call static method $method on Class $class: Invalid Class");
          }
      
          if (!method_exists($class, $method)) {
              throw new \Exception("Cannot call static method $method on Class $class: Invalid method");
          }
      
          return forward_static_call_array([$class, $method], $args);
      }));
      

      这种方法的主要优点是它适用于任何类和方法的组合。

      用法:

      {# This will call \Mynamespace\Mypackage\Myclass::getStuff(); #}
      {% set result = callstatic('\\Mynamespace\\Mypackage\\Myclass', 'getStuff') %}
      

      它还支持参数:

      {# This will call \Mynamespace\Mypackage\Myclass::getStuff('arg1', 'arg2'); #}
      {% set result = callstatic('\\Mynamespace\\Mypackage\\Myclass', 'getStuff', 'arg1', 'arg2') %}
      

      【讨论】:

      • 非常优雅的解决方案! +1 教我forward_static_call_array
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 2011-10-10
      • 1970-01-01
      • 2012-05-20
      • 2021-12-11
      • 2017-06-10
      相关资源
      最近更新 更多