资产:转储和资产之间的区别:安装

时间:2014-04-04 21:16:41

标签: symfony assetic

在Symfony2中,assetic:dumpassets:install之间有什么区别?在什么情况下应该使用这些命令中的每一个,以及以什么顺序(如果顺序是相关的)?

1 个答案:

答案 0 :(得分:133)

我实际上是wrote about this recently在一篇关于OroCRM的文章中,它基于Symfony 2.如果你想要一些上下文/为什么不同的命令,你可能会发现它很有趣。

在Symfony应用程序中有两种不同的系统可用于包含前端文件(javascript,css,images等)。 assets:install命令首先出现。此命令将搜索应用程序中的所有Symfony Bundles以获取

Resources/public

文件夹。如果找到,assets:install命令将从Resources/public复制或符号链接文件到web/public/bundle/[bundle-name]。这是使用twig assets函数创建的链接将查找这些文件的位置。此

<script src="{{ asset('js/script.js') }}" type="text/javascript"></script>

成为这个

<script src="/bundles/[bundle-name]/js/script.js" type="text/javascript"></script>

这就是assets系统的全部功能。它允许您使用捆绑包存储前端文件。

assetic系统不同。使用assetic,您可以链接到这样的文件。

{% javascripts '@AcmeFooBundle/Resources/public/js/foo.js' %}
    <script type="text/javascript" src="{{ asset_url }}"></script>
{% endjavascripts %}

样式表和图像有类似的标签。请注意,assetic允许您链接到任何捆绑包中的文件。 (@AcmeFooBundle)。 Assetic还允许您使用通配符链接到文件夹中的多个文件。

{% javascripts '@AcmeFooBundle/Resources/public/js/*' %}
    <script type="text/javascript" src="{{ asset_url }}"></script>
{% endjavascripts %}

assetic的另一个区别在于生成的链接。在dev环境中,它们看起来像这样。

<script type="text/javascript" src="/app_dev.php/js/foo.js"></script>
<script type="text/javascript" src="/app_dev.php/js/bar.js"></script>

也就是说,对这些文件的请求将通过app_dev.php包中的特殊路由设置通过PHP前端控制器(assetic)运行。这意味着,当您处于dev模式时,您永远不需要转储资产。它们是自动包含的。它还允许您将过滤器应用于文件。例如,以下内容将cssrewrite过滤器应用于所引入的文件。

{% stylesheets 'bundles/acme_foo/css/*' filter='cssrewrite' %}
    <link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}

如果您想以编程方式更改前端资源的输出,assetic可以通过编写自定义树枝过滤器来实现。

然而,这是性能密集型的。在生产中,不是通过PHP前端控制器文件单独链接每个文件,生成的HTML将如下所示

<script type="text/javascript" src="/js/as5s31l.js"></script>

as5s31l.js来自哪里?这就是assetic:dump命令的作用。它组合所有单独的javascript / css文件(在应用过滤器之后)并为生产创建一个漂亮,静态,可缓存的文件。

您需要做什么

除非项目明确告诉您,否则您应始终运行assets:installassetic:dump,因为您永远不会知道哪些第三方捆绑包使用这些命令。在assetic:dump模式下部署或查看应用程序之前,您只需运行prod。订单无关紧要。

至于您的捆绑应该使用哪个系统 - 如果您已经阅读了上述内容并且您不确定assetic可以为您做什么,请使用assets。你会没事的。