我正在尝试在Twig 中编写模板。在其中,我希望它对来自控制器的字符串数据执行一些操作。特别是,我想将一个常见的操作(从 转换underscore_case为CamelCase)带入一个单独的函数中。然后我可以像{% set x = magic(a) ~ magic(b) %}. 但是我找不到如何在模板本身内部创建这样一个可重用的功能。有宏,但那些似乎无法返回值。过滤器是另一个似乎符合要求的选项,但我只能在 PHP 端定义它们。
这能做到吗?还是我应该在控制器端进行所有高级字符串操作?感觉就像我在那里拉动部分显示逻辑;应该在视图中的东西。
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)
你是对的,宏没有返回值,你不能真正让它们有返回值。他们所做的只是输出字符串。
尽管如此,您仍然可以使用以下命令捕获字符串输出set: https: //twig.symfony.com/doc/2.x/tags/set.html
语法看起来类似于:
{% set var -%}
{{- call.macro() -}}
{%- endset %}
Run Code Online (Sandbox Code Playgroud)
宏调用的输出然后存储在 内var。不过,您可能想去掉空格。
但然后,考虑重新考虑你正在做的事情。这仍然是表示逻辑,还是您的控制器只是“太懒”而无法在将字符串传递给树枝之前转换字符串?如果它确实是表示逻辑,那么通过扩展树枝来简单地添加树枝过滤器肯定是值得的。不仅因为您的代码变得可测试。
| 归档时间: |
|
| 查看次数: |
4863 次 |
| 最近记录: |