我正在尝试在symfony2中使用assetic来管理我的CSS。 链接生成正常。但是,不会生成任何文件。
这是我的配置:
Layout.html.twig
{% stylesheets
'@FooBundle/Resources/public/css/main.css'
filter='cssrewrite'
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
Config.yml
assetic:
debug: %kernel.debug%
use_controller: false
bundles: [ FooBundle ]
filters:
cssrewrite: ~
Config_dev.yml
assetic:
use_controller: true
Assetic生成te链接foo.foo/app_dev.php/css/957d3aa_main_1.css
。但是,该文件不存在(或其他任何地方)。我已经尝试过使用权限并查看(nginx)日志,但到目前为止还没有。
非常感谢所有帮助。
答案 0 :(得分:35)
在处理资产时,您有 2个选项。您没有在计算机中看到资产的原因是您选择了选项1.
这意味着在开发环境中生成的每个资产路径都由Symfony动态处理。因此,Assetic会生成CSS和JavaScript文件的路径,这些文件实际上并不存在于您的计算机上。这是一个内部Symfony控制器,可以打开文件并为您回送内容。
<强> 优点: 强> - 对您的资产所做的更改立即生效 - 这在开发模式下非常棒,因为Symfony会为您动态生成文件
<强> 缺点: 强> - 这在prod模式下是不可能的,因为动态渲染每个资源会太慢 - 您的计算机无法直接访问资产(这就是您无法找到该文件的原因) - 如果使用大量过滤器等,可能会很慢......
要在开发模式下执行此操作,只需在config_dev.yml中编辑assetic配置:
assetic:
use_controller: true
如果您不想动态处理资产,可以手动转储资产,这意味着实际上是在您的计算机上编写资产。
<强> 优点: 强> - 不需要Symfony动态生成文件,因此运行速度会快得多 - 因此,这在产品模式下是完美的 - 可以在Web /目录中(或者您选择输出文件的任何地方)物理访问文件
<强> 缺点: 强> - 您每次更改时都需要转储资产。或者您可以使用--watch命令转储资产,如果您在开发模式下工作,这可能会有点烦人。
要做到这一点:
将use_controller设置为false(config_dev.yml):
assetic:
debug: %kernel.debug%
use_controller: false
如有必要,您甚至可以选择阅读和输出资产的位置
assetic:
read_from: %kernel.root_dir%/Resources/views/
write_to: %kernel.root_dir%/../web/thefolderyouwant/
现在,输出从资产
中的 write_to 配置开始{% stylesheets
'@FooBundle/Resources/public/css/main.css'
output='css/main.css'
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
如果继续,您将有resource error,因此请在config_dev.yml中注释掉或删除这些资产路线:
_assetic:
resource: .
type: assetic
最后,您可以自动生成资源,以便您所做的更改立即生效:
php app/console assetic:dump --watch
在这种情况下,该文件现在应该可用:
/web/thefolderyouwant/css/main.css
有关详细信息,请参阅食谱:How to use Assetic for Asset Management?
答案 1 :(得分:0)
我遇到了同样的问题,我只需要安装java
sudo apt-get install default-jre
你也可以看一下输出的开头,这可能会有所帮助:
app/console assetic:dump > outfile 2>&1
答案 2 :(得分:0)
如果您使用SASS编译SCSS但use_controller: true
或未安装ruby gem ruby
,则sass
启用时也无法生成文件。< / p>
答案 3 :(得分:0)
我有一个与此非常相似的错误。突然资产停止了工作。我添加的唯一内容是FOSRestBundle。也许你正在使用剩下的包。
这是我的解决方案:
fos_rest:
routing_loader:
default_format: json
param_fetcher_listener: true
body_listener: true
format_listener:
rules:
# render "/api" requests as json
- { path: ^/api, priorities: [ json ], fallback_format: json, prefer_extension: true }
# default, fallback rendering twig templates
- { path: ^/, priorities: ['html', 'application/javascript', 'text/css', '*/*'], fallback_format: html, prefer_extension: true }
我将priorities: ['html', '*/*']
更改为priorities: ['html', 'application/javascript', 'text/css', '*/*']
,现在一切正常。
答案 4 :(得分:0)
我终于找到了解决方法!我在这个问题上工作了几个小时!您写道:
'@FooBundle/Resources/public/css/main.css' filter='cssrewrite'
但是'cssrewrite'过滤器不接受@FooBundle语法!您必须这样做:
php app/console assets:install
Symfony将创建:
web/bundles/yourbundle/css/main.css
现在,在您的树枝模板中,替换:
'@FooBundle/Resources/public/css/main.css' filter='cssrewrite'
具有:
'bundles/yourbundle/css/main.css' filter='cssrewrite'
希望它会帮助别人! (它是用Symfony文档编写的。.^^)