2014-02-14 88 views
2

我有一個服務,可以生成並返回簡單的麪包屑HTML代碼。但在模板我總是需要使用|raw過濾:如何在服務模板中不使用原始過濾器

{{ $breadcrumb|raw }} 

,否則我可以看到轉義的HTML代碼,而不是一個真正的鏈接:

<a href="/">Home</a>/<a href="/contacts">Contacts</a> 

隨着|raw過濾它的工作很好,但也許我做了什麼錯誤,並且有沒有其他方法可以在不使用|raw篩選器的情況下執行此操作?或者在這種情況下通常使用原始過濾器?我認爲有更合適的解決方案,不是嗎?請幫助我更好地理解它。

回答

5

傳遞給樹枝模板的每個參數默認都是轉義的。所以通常你需要使用raw過濾器。但是如果使用raw過濾器對你很煩,那麼你有兩個選擇。

首先 - 禁用autoescaping(不推薦):

打開autoescaping全球關閉的設置autoescape選項falseconfig.yml

twig: 
    autoescape: false 

二 - 創建樹枝擴展(推薦):

使用函數創建樹枝擴展,該函數將渲染c意圖和它是安全的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() }} 
+0

第二種情況是非常好的,我試試吧。謝謝! –

相關問題