使用Assetic/Twig/Symfony2,我可以定义前端库吗?

使用Assetic/Twig/Symfony2,我可以定义前端库吗?,symfony,twig,assetic,Symfony,Twig,Assetic,我用的是Symfony2,还有Assetic和Twig。我有各种前端库——主干库、jQuery库、jQueryUI库和引导库。Bootstrap和jqueryui都包含CSS和JS文件 有没有一种方法可以让我定义它们需要包含的资源(包括依赖项),然后在Twig/Assetic中将所有这些资源都包含在一个标记中?我想要的是: // config.yml <!-- DOES NOT WORK --> assetic: resources: jquery: js:

我用的是Symfony2,还有Assetic和Twig。我有各种前端库——主干库、jQuery库、jQueryUI库和引导库。Bootstrap和jqueryui都包含CSS和JS文件

有没有一种方法可以让我定义它们需要包含的资源(包括依赖项),然后在Twig/Assetic中将所有这些资源都包含在一个标记中?我想要的是:

// config.yml <!-- DOES NOT WORK -->
assetic:
  resources:
    jquery:
      js: /filepath/to/jquery.js
    jquery_ui:
      dependencies: jquery
      css: /filepath/to/jqueryui.css
      js: /filepath/to/jqueryui.js
    less:
      js: /filepath/to/less.js
    bootstrap:
      dependencies: { less, jquery }
      js: /filepath/to/bootstrap.js
      css: /filepath/to/bootstrap.css
    backbone:
      dependencies: { jquery }
      js: { /filepath/to/underscore.js, /filepath/to/backbone.js }

// view.html.twig
{% use jquery_ui %}
{% use bootstrap %} 

// outputs all js and css for jQuery, jQueryUI, Less, Backbone, and Bootstrap
//config.yml
资产:
资源:
jquery:
js:/filepath/to/jquery.js
jquery_用户界面:
依赖项:jquery
css:/filepath/to/jqueryui.css
js:/filepath/to/jqueryui.js
减:
js:/filepath/to/less.js
引导:
依赖项:{less,jquery}
js:/filepath/to/bootstrap.js
css:/filepath/to/bootstrap.css
骨干:
依赖项:{jquery}
js:{/filepath/to/underline.js,/filepath/to/backbone.js}
//view.html.twig
{%使用jquery\u ui%}
{%使用引导%}
//输出jQuery、jQueryUI、Less、主干和引导的所有js和css
我发现了几个相关的问题:

但两者似乎都不涉及在config.yml中定义资源。相反,它们在
base.html.twig
中定义它们,但这正是我试图避免的


我尝试在Twig中使用
use
标记,方法是定义一个名为“jquery\u ui”的模板,在该块中使用
{%stylesheets%}
{%javascripts%}
然后在
base.html.Twig
中放置
{%use“jquery ui.html”}
。但是,
use
不会导入模板,因为它有一个主体。

尽管确实支持定义前端库,但遗憾的是不支持依赖项解析。您还必须分别定义CSS和JavaScript

我一直在做的是在
/app/config/
中创建一个名为
assets.yml
的单独文件,并将其包含在主配置中以保持整洁

assetic:
    assets:
        jquery:
            inputs:
                - '%kernel.root_dir%/Resources/public/js/jquery.js'
                - '%kernel.root_dir%/Resources/public/js/jquery-ui.js'
        my_lib:
            inputs:
                - '%kernel.root_dir%/Resources/public/js/my-custom-lib.js'
                - ...
请注意,默认情况下,Symfony2中的´%kernel.root_dir%´解析为
app
目录。您现在可以使用细枝模板中的资源

{% block javascripts %}
    {% javascripts '@jquery' '@my_lib' output="js/jquery.js" %}
        <script type="text/javascript" src="{{ asset_url }}"></script>
    {% endjavascripts %}
{% endblock %}
{%block javascripts%}
{%javascripts'@jquery'@my_lib'output=“js/jquery.js”%}
{%endjavascripts%}
{%endblock%}

CSS文件也可以这样做。该示例还演示了为什么不可能将CSS和JavaScript定义为单个资产。

您可能想查看Cartero,它允许您定义“资产包”,包括依赖项,然后将这些包包含在页面中


您需要编写一个Symfony2钩子,但这不会太难。

最简单的解决方案是将它们放在web/目录中的适当目录中,因为这是为所有Symfony捆绑包提供服务的站点的根目录。

我建议在项目的根目录中使用
package.json
,以及如何在项目根目录下的文件中重建工作区的记录。有时我也会在
app/
目录中添加脚本。我怎么能使用package.json呢?这看起来很棒。但是,我有一个问题,当您扩展模板的
{%block javascripts%}
时会发生什么?。大概您需要在子对象中使用
{{parent()}
占位符。是否最好在
{%block javascripts%}
之外定义
{%javascripts%}
标记,以避免每次都必须键入该标记?子模板是否也可以包含
{%javascripts%}
标记?Assetic是否仍然足够聪明,可以只编译一个css/js文件?还是为“全局”站点编译一个,为扩展包编译另一个?@cartbeforehorse是的。如果要扩展模板并希望向页面添加更多脚本,则必须使用
{{parent()}}
。Assetic不会将父脚本和扩展模板中的脚本编译为单个文件,我认为这很好-客户端将缓存常见脚本并下载页面的唯一脚本。或者,如果您不想每次都写
{{{parent()}
,您可以定义一个单独的块。@gilden我应该在提问之前先做更多的测试。我的困惑源于我没有完全理解
{%javascripts%}
标记。我做了更多的研究,现在理解得更好了。不过,谢谢你的回复——它也证实了我发现的其他一切,这让我感到放心。