阅读完这篇帖子:如何强制浏览器重新加载缓存的CSS/JS文件?
我想知道在Symfony中是否有任何内置功能或简单的方法,当它发现JavaScript / CSS文件已被修改时,自动通过附加随机查询字符串或时间戳来强制重新加载链接。 (通常,人们使用
use_javascript
函数生成<script>
标记)use_javascript
函数生成<script>
标记)虽然没有内置机制,但是一些创意可以让你在代码的任何位置实现这个功能,从 view.yml 到 layout.php 再到每个单独的操作。
使用 view.yml 方法非常简单:
apps/frontend/config/view.yml:
stylesheets: [main?v=<?php echo time() ?>, reset?v=<?php echo time() ?>, layout?v=<?php echo time() ?>]
虽然我认为这有点过于主动,我倾向于使用SVN修订版本或整个项目的版本号:
stylesheets: [main?v=<?php echo sfConfig('app_project_version') ?>, reset?v=<?php echo sfConfig('app_project_version') ?>, layout?v=<?php echo sfConfig('app_project_version') ?>]
在 apps/frontend/config/app.yml 中设置了 app_project_version
。从这里开始,layout.php 和actionSuccess.php 的方法应该很容易:
<?php use_stylesheet('blah?v='.sfConfig::get('app_project_version')); ?>
不要为每个包含的样式表设置版本,最好自动为所有包含的样式表完成此操作,无论您是使用view.yml还是use_stylesheet()方法。您需要实现此辅助方法并将其包含在应用程序的settings.yml中,以便它对所有操作可用。
`
function include_versioned_stylesheets()
{
$response = sfContext::getInstance()->getResponse();
sfConfig::set('symfony.asset.stylesheets_included', true);
$html = '';
foreach ($response->getStylesheets() as $file => $options) {
$filepath = sfConfig::get('sf_web_dir') . '/' . stylesheet_path($file);
if(file_exists($filepath)) {
$file .= '?v=' . filectime($filepath);
}
$html .= stylesheet_tag($file, $options);
}
echo $html;
}
``
我已经更新了答案并提供了该解决方案。 - Raise