symfony twig宏可以返回值吗?

aydmsdu9  于 11个月前  发布在  其他
关注(0)|答案(4)|浏览(103)

我想用Twig写一个模板。在它里面,我希望它对来自控制器的字符串数据执行一些操作。特别是,有一个常见的操作(从underscore_case转换为CamelCase),我想将其引入到一个单独的函数中。然后我可以像{% set x = magic(a) ~ magic(b) %}一样反复使用它。然而,我无法找到如何使这样一个可重用的功能内的模板本身。有一些宏,但它们似乎不能返回值。过滤器是另一个似乎符合要求的选项,但我只能在PHP端定义它们。
这可以做到吗?或者我应该在控制器端执行所有高级字符串操作?这有点像我在那里拉显示逻辑的一部分;应该在视图中的东西。

mkh04yzy

mkh04yzy1#

细枝用于输出数据。如果您需要“转换”数据,则需要在将其发送到twig或extend 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);
    }
}

字符串
然后将其添加到您的twig示例中。我在这里添加了一个完整的示例化循环。如果您有一个服务提供者,则可以从那里获取示例并将其添加到该示例中。

$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);


然后,在您的twig代码中,您应该能够执行以下操作:

{% set x = toolkit.magic_tidle("value","value_b") %}

zvms9eto

zvms9eto2#

你是对的,宏没有返回值,你不能让它们有任何返回值。他们所做的只是输出字符串。
不过,您仍然可以使用set捕获字符串输出:https://twig.symfony.com/doc/2.x/tags/set.html
语法看起来类似于以下内容:

{% set var %}
    {{ call.macro() }}
{% endset %}

字符串
然后,宏调用的输出存储在var中。不过,您可能希望去掉空白。
然后,考虑重新思考你正在做的事情。这仍然是表示逻辑吗?或者您的控制器只是“太懒”,在将字符串传递给twig之前不转换它们?如果这真的是表示逻辑,那么通过扩展twig简单地添加一个twig过滤器肯定是值得的。不仅因为你的代码变得可测试。

fsi0uk1n

fsi0uk1n3#

这可以做到吗?
是的!但是,Twig模板不是运行逻辑的理想位置。至少,我们应该尽力避免它。相反,Controller应该返回Twig模板需要的内容。逻辑应该运行在服务,实用程序,助手(你的名字)等。然后控制器将其返回给小枝。然后Twig只是显示它。
twig宏可以返回值吗?
是的!看this example。它接受参数并返回(不是真实的的“返回”,但你明白了)一些东西。
范例:
假设您试图操作的数据是简单的。

use Doctrine\Common\Inflector\Inflector;

Controller
{
   action() {
      $data = Inflector::camelize('hello_world'); // This will become helloWorld

      return ....;
   }
}

字符串
查看Inflector类。它有有用的东西。

yyhrrdl8

yyhrrdl84#

这实际上是可以用Twig实现的,而不必编写任何PHP扩展,就像这样:

{% macro calculateSales(orders) %}
    {% set result = 0.0 %}
    {% for order in orders %}
        {% set result = result + order['price'] * order['quantity'] %}
    {% endfor %}
    {{ result }}
{% endmacro %}

{% set total = _self.calculateSales(orders) | spaceless %}

{{ total * 0.08 }}

字符串
更多信息请参见文章Making Twig Macros Work Like Functions

相关问题