我怎么能不在服务模板中使用| raw filter

Vic*_*sky 2 symfony twig

我有一个服务,生成并返回breadcrumb的简单html代码.但在模板中我总是需要使用|raw过滤器:

{{ $breadcrumb|raw }}
Run Code Online (Sandbox Code Playgroud)

否则我可以看到转义的HTML代码,而不是真正的链接:

<a href="/">Home</a> / <a href="/contacts">Contacts</a>
Run Code Online (Sandbox Code Playgroud)

使用|raw过滤器它运行良好,但也许我做错了什么,有没有其他方法可以做到这一点没有|raw过滤器?或者在这种情况下通常使用原始过滤器?我认为有更合适的解决方案,不是吗?请帮我更好地理解它.

小智 6

默认情况下,传递给twig模板的每个参数都会被转义.所以通常你需要使用raw过滤器.但如果使用raw过滤器对你来说很烦人,那么你有两个选择.

首先 - 禁用自动转换(不推荐):

通过将autoescape选项设置为falsein 来全局关闭自动关闭config.yml:

twig:
    autoescape: false
Run Code Online (Sandbox Code Playgroud)

第二 - 创建树枝延伸(推荐):

创建具有将呈现内容的功能的枝条扩展,并且它是html安全的.

<?php

// src/Acme/DemoBundle/Twig/BreadcrumbExtension.php
namespace Acme\DemoBundle\Twig;

class BreadcrumbExtension extends \Twig_Extension
{
    protected $breadcrumbService;

    public function __construct(BreadcrumbService $breadcrumbService)
    {
        $this->breadcrumbService = $breadcrumbService;
    }

    /**
    * Returns a list of functions to add to the existing list.
    *
    * @return array An array of functions
    */
    public function getFunctions()
    {
        return array(
            new \Twig_SimpleFunction('acme_breadcrumbs', 
                array($this, 'renderBreadcrumbs'),
                array('is_safe' => array('html'))
            ),
        );
    }

    public function renderBreadcrumbs()
    {
        return $this->breadcrumbService->renderHtml();
    }  

    public function getName()
    {
        return 'breadcrumb_extension';
    }
}
Run Code Online (Sandbox Code Playgroud)

注册服务:

<service id="acme.breadcrumb.twig.extension" class="Acme\DemoBundle\Twig\BreadcrumbExtension" public="false">
    <tag name="twig.extension" />
    <argument type="service" id="acme.breadcrumb.service" />
</service>
Run Code Online (Sandbox Code Playgroud)

现在你可以在twig模板中使用它,如下所示:

{{ acme_breadcrumbs() }}
Run Code Online (Sandbox Code Playgroud)