从没有Twig过滤器的函数返回原始HTML

时间:2016-04-08 20:03:42

标签: php twig

我有一个具有返回HTML功能的类。

class MyParser {
    public function getHTML() {
        return '<a href="#">Hello World</a>';
    }
}

然后在我的Twig模板中,我使用raw过滤器输出文字HTML,而不是让Twig为我转义:

{{ myParserInstance.HTML | raw }}

是否有一种方法可以使函数(不是Twig Filter or Function)返回原始HTML并将其呈现为这样?或者我将如何创建一个Twig过滤器或函数来为我无缝地执行此操作?

例如,我不会想要类似的东西:

{{ render(myParserInstance) }}

相反,我希望能够使用HTML函数调用。这是完全可能还是我坚持使用Twig功能或使用| raw

3 个答案:

答案 0 :(得分:11)

您可以安全地返回和Twig_Markup对象对象...

class MyParser {
    public function getHTML() {
         $rawString = '<a href="#">Hello World</a>'
         return new \Twig_Markup( $rawString, 'UTF-8' );
    }
}

class MyParser {
    public function getHTML() {
         $rawString = '<a href="#">Hello World</a>'
         return new \Twig\Markup( $rawString, 'UTF-8' );
    }
}

答案 1 :(得分:1)

很快,不,没有。

Twig是渲染引擎,因此除非您使用 SELECT t.* FROM ( SELECT m.id, m.name FROM mine m ) t 过滤器或关闭Twig中的自动视图(see this answer),否则无论您从任何方法返回的内容都将被Twig解析并进行转义。

答案 2 :(得分:0)

我写这篇文章是为了支持SilvioQ的答案,这对我来说非常有用。

在我的情况下,我正在创建一个过滤器,用于在标题块中添加样式表标记,而不必担心硬编码base-url或者在不需要时将其作为参数传递给视图。 SilvioQ的代码工作得很好,有助于保持我的观点不那么混乱。

以下是我在代码中使用它的方法:

class AppExtension extends AbstractExtension
{

    public function getFilters() {
        return array(
            new TwigFilter('css', array($this, 'cssLinkFilter')),
        );
    }

    public function cssLinkFilter($cssName){
        $link = sprintf('', getBaseURL(true), $cssName);
        return new \Twig_Markup($link, 'UTF-8');
    }
}

我还在努力,我还需要另一个Javascript。如果我改变我的代码或数字它不起作用我会更新我的答案。