2013-01-15 64 views
6

我想在我的Symfony2應用程序中從數據庫加載某些Twig模板,同時仍然保留使用本機加載程序在標準文件系統位置呈現模板的可能性。如何實現這一目標?如何在Symfony2環境中註冊另一個(自定義)Twig加載器?

據我所知,沒有可能向Twig環境註冊多個裝載機。我一直在想兩種方法(現在):

  • Replace the default loader與自定義代理類。當模板使用標準的@ Bundle-notation引用時,代理會將請求傳遞給默認的加載器。在其他情況下,請求將傳遞給我的自定義(數據庫)加載程序;或
  • 建立一個全新的Twig環境。這種方法將需要註冊自定義的樹枝擴展兩種環境,它不會允許來自不同來源的交叉參考模板(一些來自@Bundles,有的來自數據庫)

更新1:

似乎Twig支持Twig_Loader_Chain類,可以在我的第一個選項中使用。作爲第一種選擇,默認的加載器應該可以訪問並傳遞給鏈。

回答

6

要使用Twig_Loader_Chain你需要的Symfony 2.2 https://github.com/symfony/symfony/pull/6131
然後,你可以簡單地configurate您的裝載機:

services: 
    twig.loader.filesystem: 
     class: %twig.loader.filesystem.class% 
     arguments: 
      - @templating.locator 
      - @templating.name_parser 
     tags: 
      - { name: twig.loader } 
    twig.loader.string: 
     class: %twig.loader.string.class% 
     tags: 
      - { name: twig.loader } 

更新:
看起來仍存在一些問題(在文件系統加載器無法找到模板somtimes),但我發現這個:
http://forum.symfony-project.org/viewtopic.php?t=40382&p=131254

似乎很好!

+0

此問題已在Symfony 2.3中修復? – Dayson

+3

我意識到這是一箇舊的線程,但添加上面的配置會停止顯示Web配置文件調試模板 - 在它的位置下面的字符串顯示在屏幕的底部:@ WebProfiler/Profiler/toolbar_js.html.twig如何我能解決這個問題嗎? – Tocacar

0

這是一種廉價和歡快的方式來臨時更改裝載機在標準ENV:我想這將與其他自定義裝載機工作

// Keep the current loader 
    $oldLoader = $env->getLoader(); 

    // Temporarily set a string loader 
    $env->setLoader(new \Twig_Loader_String()); 

    // Resolve the template - but don't render it yet. 
    $template = $env->resolveTemplate($template); 

    // Restore the old loader 
    $env->setLoader($oldLoader); 

    // Render the template. This will pass the old loader into any subtemplates and make sure your string based template gets into the cache. 
    $result = $template->render($context); 

+0

看起來不錯,但是您如何在Symfony中獲得Twig環境? – Stan

相關問題