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

17

旧问题,请参见下面的更新版本

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

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

可以看到,这些文件是通过Symfony框架而不是直接加载的。由于我开始有超过20个文件要加载,乘以500毫秒,导致页面加载非常缓慢。我想直接加载文件,但我不知道该怎么做。

这是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

我已经为开发和通用配置设置了use_controllerfalse。我该如何去掉URL中的_controller部分?

编辑:如果我清除缓存、运行assetic:dump并将use_controller设置为false,那么重新加载后会出现Cannot load resource "."的错误。我无法解决这个问题,除非我暂时启用use_controller进行一次页面加载。之后,我禁用它并重新加载,现在它从包含_controller的无效URL请求。

它似乎在生产环境中也能正常工作,但在开发环境中则不行。奇怪。

模板代码:

{% 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(即在生产模式下),它可以正常运行。只有在开发模式下,它才无法正常工作并引发此“无法加载资源”错误,除非我先为一个请求启用use_controller,然后我可以禁用它并重新加载,尽管URL将包含_controller /


请在您的模板中展示调用资源的代码。 - Sgoettschkes
@Tower,你能写下实现这个的确切步骤吗? - johnlemon
5个回答

21

当 use_controller 为 false 时,请尝试在 routing_dev.yml 中删除此代码部分:

_assetic:
    resource: .
    type:     assetic

6
如果你使用assetic:dump,那么你就需要执行cache:clear -e dev
"...如果在生产缓存上运行cache:clear,它会以debug模式预热缓存。如果之后尝试转储资源,则可能会出现奇怪的问题。"
我在这里找到了它:http://sftuts.com/using-assetic-in-symfony2-for-css-compression(第4段)。

似乎sftuts的帖子只是在讨论在生产环境下应该怎么做,那里的建议不应影响你在开发中所做的事情。我有什么遗漏的吗? - Sam

6

Symfony文档始终是开始查找的第一处:如何使用Assetic进行资产管理

在生产环境中,您的JS和CSS文件分别由单个标签表示。换句话说,您不太可能看到源代码中包含的每个JavaScript文件,而更可能只会看到类似于以下内容:

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

此外,该文件实际上并不存在,也不像在dev环境中的asset文件那样动态渲染。这是有意为之的 - 在生产环境中让Symfony动态生成这些文件太慢了。
相反,每次在prod环境中使用应用程序时(因此,每次部署时),您应该运行以下任务:
php app/console assetic:dump --env=prod --no-debug

这将会物理地生成和写入您需要的每个文件(例如/js/abcd123.js)。如果您更新了任何资源,您需要再次运行此操作以重新生成文件。


好的,我进一步理解了,现在它正在尝试从http://localhost/myproj/_controller/js/dist/dist_jquery-1.6.2.min_1.js加载。如果没有_controller,它就可以工作。为什么会加上那个呢? - Tower
用户控制器是什么?那是什么意思? - Tower
1
这确实可以工作,而且这就是我现在正在使用的方法,但由于所有CSS和JS文件都通过PHP/SF处理,所以页面加载速度要慢得多。 - Tower

6

根据文档,修改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

1

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

_assetic:
 resource: .
 type:     assetic

将use_controller设置为false。 这样做后,我就能使用assetic:dump并查看工作页面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接