2013-10-20 83 views
3

我有一個使用Symfony 2編寫的單頁web應用程序,其中所有css和javascript資源都位於web/static/all.js和web/static/all.js中。這些距離intex.html.twig模板以標準的方式鏈接:將css和javascript資源的內容嵌入Symfony中的視圖

{% javascripts output='static/all.js' filter="?closure" 
    '@MyBundle/Resources/assets/vendor/jquery/jquery.js' 
    '@MyBundle/Resources/assets/...' 
    '@MyBundle/Resources/assets/...' 
%} 
    <script type="text/javascript" src="{{ asset_url }}"></script> 
{% endjavascripts %} 

{% stylesheets output='staic/all.css' filter="?yui_css" combine=true 
    '@MyBundle/Resources/assets/css/reset.css' 
    '@MyBundle/Resources/assets/css/...' 
    '@MyBundle/Resources/assets/css/...' 
%} 
    <link rel="stylesheet" href="{{ asset_url }}" type="text/css" media="all" /> 
{% endstylesheets %} 

這已經很酷了,因爲瀏覽器只需要做的第一期間推出3個請求和1或0的請求後(所有.css和all.js使用.htaccess緩存)。

但我想更進一步,只需將所有css和js轉儲到index.html,類似於Google在其主頁上執行的操作。這將在第一次運行期間僅導致一個http請求,這會加快應用程序的速度。最好有一個標誌傳遞給模板,或者保存在twig全局模式中,這樣可以根據需要在兩種模式之間切換。

{%if dumpAssetsIntoTemplate %} 
    {# all js and css here #} 
{% else %} 
    {# asset urls #} 
{% endif %} 

這怎麼能用最小的痛苦來完成?

回答

2

如果你看看Twig reference about Twig extensions,你可以看到render函數帶有一個路徑或一個URL。

{{ render(path('route', {params})) }} 
{{ render(url('route', {params})) }} 

引用文檔中的用法「這將呈現給定控制器或URL的片段」。

所以我會嘗試:

<style type="text/css"> 
{% stylesheets output='static/all.css' filter="?yui_css" combine=true 
    '@MyBundle/Resources/assets/css/reset.css' 
    '@MyBundle/Resources/assets/css/...' 
    '@MyBundle/Resources/assets/css/...' 
%} 
    {{ render(asset_url) }}" 
{% endstylesheets %} 
</style> 

與JavaScript文件相同的方法。

如果不起作用,您可能需要調整Assetic包的設置,特別是名爲use_controller的設置。

+0

謝謝!它爲我工作。 這是怎樣的代碼看起來在末尾(JS): {%的JavaScript輸出= 'all.js' 過濾器= 「?封」 '@ MyBundle /資源/資產/ ......' %} {%如果dumpAssetsIntoTemplate%} <腳本類型= 「文本/ JavaScript的」> {{渲染(ASSET_URL)}} {%其他%} <腳本類型= 「文本/ JavaScript的」 SRC =「{{ASSET_URL} }「> {%endif%} {%endjavascripts%} –

+0

這似乎只適用於開發環境。在製作中,渲染內容是空的。 – Adambean