如何使Symfony2直接加载CSS、JS文件,而不是通过PHP


How to make Symfony2 to load CSS, JS files directly and not via PHP?

旧问题,更新版本见下文

我的开发环境不是最快的。每个PHP请求大约需要500毫秒。Symfony2资源文件开始成为一个问题,因为每个资源文件都是通过Symfony的内部控制器请求的:

http://localhost/myproj/app_dev.php/js/bb8690a_part_4_myJavaScriptFile_2.js

可以看出,这些文件是通过Symfony框架加载的,而不是直接加载的。由于我开始有超过20个文件要加载,所以将其和500ms相乘会使页面加载非常缓慢。我想直接加载文件,但我不确定如何做到这一点。

这是config.yml:的一部分

# Assetic Configuration
assetic:
    debug:          %kernel.debug%
    use_controller: false
    # java: /usr/bin/java
    filters:
        cssrewrite: ~

我认为将use_controller设置为false可以做到这一点,但没有。

有没有办法直接处理这些资源的负载?

更新:

这是它现在尝试使用的URL:

http://localhost/myproj/_controller/js/bb8690a_part_4_myJavaScriptFile_2.js

我已经为dev和general配置将use_controller设置为false。如何删除URL中的_controller部分?

编辑:如果我清除缓存,运行assetic:dump并将use_controller作为false,那么在重新加载时,我会得到Cannot load resource "."。除非我临时启用use_controller以加载一页,否则我无法解决这个问题。之后,我禁用它并重新加载,现在它从包含_controller的无效URL请求。

它似乎在prod中也起作用,但在dev.Strange中不起作用。

模板代码:

{% stylesheets filter="cssrewrite"
            'bundles/outotecofil/css/reset.css'
            'bundles/outotecofil/css/*'
            output='css/dist/dist.css'
        %}
        <link rel="stylesheet" href="{{ asset_url }}" />
        {% endstylesheets %}
        {% javascripts
            '@OutotecCommonBundle/Resources/public/js/jquery-1.6.2.min.js'
            '@OutotecCommonBundle/Resources/public/js/jquery-ui-1.8.16.custom.min.js'
            '@OutotecCommonBundle/Resources/public/js/chosen.jquery.min.js'
            '@OutotecCommonBundle/Resources/public/js/widget/*'
            '@OutotecOFILBundle/Resources/public/js/OFILDependencyManager.js'
            '@OutotecOFILBundle/Resources/public/js/widget/*'
            '@OutotecOFILBundle/Resources/public/js/plant-scope.js'
            output='js/dist/dist.js'
        %}
        <script src="{{ asset_url }}"></script>
        {% endjavascripts %}

非常清楚的是:如果没有app_dev.php(即在prod模式下(,它就可以工作。只有在dev中它没有,并抛出"无法加载资源"。"错误,除非我首先为一个请求启用use_controller,然后我可以禁用它并重新加载,尽管URL的路径中会包含_controller/

当use_controller为false时,尝试删除routing_dev.yml中的这部分代码:

_assetic:
    resource: .
    type:     assetic

Symfony文档始终是第一个开始查看的地方:如何将Assettic用于资产管理

在prod环境中,JS和CSS文件分别由一个标记表示。换句话说,您可能只看到这样的东西,而不是看到源代码中包含的每个JavaScript文件:

<script src="/app_dev.php/js/abcd123.js"></script>

此外,该文件实际上并不存在,也不是由Symfony动态呈现的(因为资产文件在开发环境中(。这是故意的——让Symfony在生产环境中动态生成这些文件太慢了。

相反,每次在prod环境中使用应用程序时(因此,每次部署时(,都应该运行以下任务:

php app/console assetic:dump --env=prod --no-debug

这将在物理上生成并写入您需要的每个文件(例如/js/abcd123.js(。如果您更新任何资产,则需要再次运行此操作来重新生成文件。

如果使用assetic:dump,则必须使用cache:clear -e dev

"…如果你在生产缓存上运行cache:clear,它会在调试模式打开的情况下预热缓存。如果你之后试图转储资产,可能会发生奇怪的事情。">

我在这里找到它:http://sftuts.com/using-assetic-in-symfony2-for-css-compression(4(。段落(

来自文档

修改dev配置以避免使用控制器。

# app/config/config_dev.yml
assetic:
    use_controller: false

删除routing_dev.yml中的路由以避免副作用

# app/config/routing_dev.yml
_assetic:
    resource: .
    type:     assetic

每次修改时自动转储css/less文件。

php app/console assetic:dump --watch

我也有同样的问题,工作配置是:从routing_dev.yml:中注释掉

_assetic:
 resource: .
 type:     assetic

将use_controller设置为false。完成此操作后,我可以使用assetic:dump并查看工作页面。