将不可转义的变量传递给 Twig 模板

问题描述 投票:0回答:1

我需要在 Twig 中显示未转义的变量。我知道 template raw 和 unescape 函数和过滤器,但在这里使用它们有点复杂。

是否可以在将参数传递给模板时定义未转义的变量?

// e.g
$vars['rawvar'] = new RawTwigParam('<table><tr><td>HTML table</td></tr></table>');
$vars['normalvar'] = 'This & That';

$twig = new Environment($loader, ['debug' => true]);
return $twig->createTemplate($template)->render($vars);
php twig
1个回答
0
投票

您问的是Twig Escaper Extension,根据您的问题,您已将 Twig 配置为启用它。

启用后,您需要使用它附带的

raw
过滤器。

否则,如果禁用,则没有这样的

raw
过滤器。

raw
过滤器是您可以使用的最短的模板指令,但它需要您触摸模板。您可以在现有的问答中找到 概述;例如“如何在模板中将纯文本呈现为 HTML?”.

为了防止此类编辑,Twig Escaper Extension 提供了一种附加机制。它的工作原理是使用神奇的

__toString()
方法将 HTML 字符串包装到对象中,并将该类作为 “安全类” 添加到 Escaper。这允许您将类或接口标记为对于某些策略是安全的。协议是
EscaperExtension::addSafeClass()

Twig 文档中的示例(许可证):

// mark object of class Foo as safe for the HTML strategy
$escaper->addSafeClass('Foo', ['html']);

// mark object of interface Foo as safe for the HTML strategy
$escaper->addSafeClass('FooInterface', ['html']);

// mark object of class Foo as safe for the HTML and JS strategies
$escaper->addSafeClass('Foo', ['html', 'js']);

// mark object of class Foo as safe for all strategies
$escaper->addSafeClass('Foo', ['all']);

用你的例子:

interface RawTwigParamPureAbstract
{
    /* intentionally left blank */
}

abstract class RawTwigParam implements RawTwigParamPureAbstract 
{
    final public function __construct(public readonly string $html)
    {
        /* intentionally left blank */ 
    }

    final public function __toString(): string
    {
        return $this->html;
    }
}


$vars['rawvar'] = new class('<HTML>…') extends RawTwigParam {};
$vars['normalvar'] = 'This & That';

$twig = new Environment($loader, ['debug' => true]);
$escaper = $twig->getExtension(\Twig\Extension\EscaperExtension::class);
$escaper->addSafeClass(RawTwigParamPureAbstract::class, ['all']);
return $twig->createTemplate($template)->render($vars);

示例代码未经测试,因此可能会出现问题,但应该足够了。如果没有,请在下面查找评论。

抽象模板类还可以提供一些方法来更多 轻松绑定到 Twig 环境;更多服务就是更多服务,YMMV。

© www.soinside.com 2019 - 2024. All rights reserved.