我有一个服务,生成并返回breadcrumb的简单html代码。但在模板中,我总是需要使用|raw
过滤器:
{{ $breadcrumb|raw }}
否则我可以看到转义的HTML代码,而不是真正的链接:
<a href="/">Home</a> / <a href="/contacts">Contacts</a>
使用|raw
过滤器可以很好地工作,但是我可能做错了,还有其他方法可以在没有|raw
过滤器的情况下执行此操作吗?或者在这种情况下通常使用原始过滤器?我认为有更合适的解决方案,不是吗?请帮助我更好地理解它。
答案 0 :(得分:6)
默认情况下,传递给twig模板的每个参数都会被转义。因此通常需要使用raw
过滤器。但如果使用raw
过滤器对您来说很烦人,那么您有两种选择。
首先 - 禁用自动转移(不推荐):
通过在autoescape
中将false
选项设置为config.yml
来全局关闭自动关联:
twig:
autoescape: false
第二 - 创建树枝延伸(推荐):
使用函数创建twig扩展,该函数将呈现内容,并且它是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';
}
}
注册服务:
<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>
现在你可以在像这样的树枝模板中使用它:
{{ acme_breadcrumbs() }}