【问题标题】:twig template engine, using a static function or variabletwig 模板引擎,使用静态函数或变量
【发布时间】:2011-10-14 05:29:24
【问题描述】:

有没有办法在 twig 中调用静态函数或使用静态变量?

我有一类静态辅助函数,想在模板中使用一个或两个。

【问题讨论】:

  • 你想达到什么目的?只是传递变量或提供您自己的函数以在模板中使用?
  • 我有一类静态辅助函数,所以希望我能以某种方式调用它们,而无需使用 addFunction 添加它们。
  • 我认为另外,这对你来说也是一个有趣的答案:twig - pass function into template

标签: php templates twig


【解决方案1】:

我最终采用了几种方法。

首先是一个可以调用静态函数的函数。

$twig = new Twig_Environment($loader);
$twig->addFunction('staticCall', new Twig_Function_Function('staticCall'));

function staticCall($class, $function, $args = array())
{
    if (class_exists($class) && method_exists($class, $function))
        return call_user_func_array(array($class, $function), $args);
    return null;
}

然后可以像这样使用,

{{ staticCall('myClass', 'mymethod', [optional params]) }}

另一种是使用魔法。

将类添加到渲染 $context

$data['TwigRef']  = new TheClass();

class TheClass
{
    public function __call($name, $arguments) {
        return call_user_func_array(array('TheClass', $name), $arguments);
    }

    ...
}

然后可以像这样使用,

{{ TwigRef.myMethod(optional params) }}

最好添加一些额外的检查,以便只调用批准的函数。

【讨论】:

  • 我以前见过这个。我还没有看到它的位置。请问,在一个 SF2 项目中,这段代码应该去哪里? $loader 是在哪里定义的?
  • 当您传递完整的类名及其命名空间时,如何使第一个解决方案工作?
  • 好一个。我想这不应该出现在交响乐 2 项目中
  • 当时我正在使用 Yii,但这应该很容易融入 Symphony。
  • @AlexanderMorland 请参阅twig.sensiolabs.org/doc/api.html 实际上$loader 应该在您的应用程序配置中定义,以实例化树枝。
【解决方案2】:

您可以通过注册来动态地将函数添加到您的树枝模板中。要么它们已经可以调用,要么你用它自己的名字给你的静态函数起别名:

$twig = new Twig_Environment($loader);
$twig->addFunction('functionName', new Twig_Function_Function('someFunction'));

请参阅Functions section in Extending Twig

【讨论】:

  • 认为我需要创建自己的函数,以便可以使用静态函数。像静态的东西('class','function',[params])
  • 可能不行,尝试将'class::function'注册为上面的'someFunction'参数,让我知道它是否有效。
  • 这是我的问题,这可能有效,但我需要为我可能需要使用的每个功能都这样做。
  • @Alex:创建另一个帮助函数,返回所有要注册的函数以数组的形式(键:名称,值:回调),然后遍历数组并自动分配它们。帮助器类应该知道它提供了哪些帮助器,因此您可以将所有内容放在一起。
猜你喜欢
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多