4

我正在使用 Symfony2、Assetic 和 Twig。我有各种前端库——Backbone、jQuery、jQuery UI 和 Bootstrap。Bootstrap 和 jQuery UI 都包含 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 中定义资源。相反,他们在其中定义它们,base.html.twig但这就是我试图避免的。

我尝试use在 Twig 中使用该标签,方法是定义一个名为“jquery_ui”的模板,并在该块中使用{% stylesheets %}and {% javascripts %},然后base.html.twig{% use "jquery-ui.html" %}. 但是,use不会导入模板,因为它有一个正文。

4

3 回答 3

16

虽然确实支持定义前端库,但遗憾的是不支持依赖解析。您还必须分别定义 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'
                - ...

请注意,'%kernel.root_dir%'app在 Symfony2 中默认解析为目录。您现在可以使用 Twig 模板中的资产。

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

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

于 2012-05-31T20:39:12.770 回答
1

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

于 2014-01-06T17:15:24.323 回答
0

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

https://github.com/rotundasoftware/cartero

你需要编写一个 Symfony2 Hook,但这不会太难。

于 2013-06-19T17:08:49.223 回答