树枝宏可以返回值吗?

Vil*_*lx- 4 php symfony twig

我正在尝试在Twig 中编写模板。在其中,我希望它对来自控制器的字符串数据执行一些操作。特别是,我想将一个常见的操作(从 转换underscore_caseCamelCase)带入一个单独的函数中。然后我可以像{% set x = magic(a) ~ magic(b) %}. 但是我找不到如何在模板本身内部创建这样一个可重用的功能。有宏,但那些似乎无法返回值。过滤器是另一个似乎符合要求的选项,但我只能在 PHP 端定义它们。

这能做到吗?还是我应该在控制器端进行所有高级字符串操作?感觉就像我在那里拉动部分显示逻辑;应该在视图中的东西。

Tsc*_*cka 6

Twig 用于输出数据。如果您需要“转换”数据,则需要在将其发送到 twig 之前执行此操作,或者您需要扩展 twig

理想情况下,您发送到 twig 的所有数据都只是需要最少操作的变量和数组。

当你真正“在”twig 时,可以假设数据处理已经“完成”,只需要在适当的地方输出,用最少的逻辑来决定用户界面样式。

因此,在将数据发送到 twig 之前,重新审视您的逻辑并更好地准备数据。

一个扩展工具包类的示例,该类包含我们的魔法方法来实现真正的魔法。

class CustomToolkit 
{
    public function magic_a($a) 
    {
        return strtolower($a);    }

    public function magic_b($b) 
    {
        return camel_case($b);
    }

    public function magic_tidle($a, $b) 
    {
        return $this->magic_a($a) ~ $this->magic_b($b);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你将它添加到你的树枝实例中。我在这里添加了一个完整的实例化循环。如果你有一个服务提供者,你可以从那里获取实例并将其添加到那个实例中。

$twig = new Twig_Environment(new Twig_Loader_Array([
                                                      'html' => $contents
                                                   ]),[
                                                      'auto_reload' => true,
                                                      'debug' => false,
                                                   ]);
$twig->addExtension('toolkit', new CustomToolkit ());
echo $twig->render('html', $values);
Run Code Online (Sandbox Code Playgroud)

然后在你的树枝代码中,你应该能够做一些事情

{% set x = toolkit.magic_tidle("value","value_b") %} 
Run Code Online (Sandbox Code Playgroud)

  • 好的,想通了。:) 就我而言,我使用了链接中提到的 `Twig_Filter` 类,并将其添加到视图中是通过 `$this->container->get('twig')->addFilter($filter);` - 我从`ControllerTrait::render` 方法中复制粘贴的关于获取 Twig 环境的部分。抱歉,我是 Symfony/Twig 的新手。:) 希望这是正常的做事方式。 (2认同)

Jos*_*hua 6

你是对的,宏没有返回值,你不能真正让它们有返回值。他们所做的只是输出字符串。

尽管如此,您仍然可以使用以下命令捕获字符串输出set: https: //twig.symfony.com/doc/2.x/tags/set.html
语法看起来类似于:

{% set var -%}
    {{- call.macro() -}}
{%- endset %}
Run Code Online (Sandbox Code Playgroud)

宏调用的输出然后存储在 内var。不过,您可能想去掉空格。

但然后,考虑重新考虑你正在做的事情。这仍然是表示逻辑,还是您的控制器只是“太懒”而无法在将字符串传递给树枝之前转换字符串?如果它确实是表示逻辑,那么通过扩展树枝来简单地添加树枝过滤器肯定是值得的。不仅因为您的代码变得可测试。