将css和javascript资源的内容嵌入到Symfony的视图中

时间:2013-10-20 17:27:24

标签: symfony twig assets assetic

我有一个用Symfony 2编写的单页webapp,其中所有css和javascript资源都位于web / static / all.js和web / static / all.js中。这些是以标准方式从intex.html.twig模板链接的:

{% 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个请求(all.css和all.js都是使用.htaccess缓存的。)

但我想更进一步,只是将所有css和js转储到index.html,类似于google在其主页上所做的那样。这将在第一次运行期间仅产生一个http请求,这将加快应用程序的速度。有一个标志我会传递给模板或保留在twig全局变量中,这样可以根据需要在两种模式之间切换。

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

如何以最小的痛苦完成这项工作?

1 个答案:

答案 0 :(得分:2)

如果查看Twig reference about Twig extensions,您可以看到render函数采用路径或网址。

{{ 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的设置。