Symfony中如何进行JavaScript/CSS的强制重新加载?

3
阅读完这篇帖子:如何强制浏览器重新加载缓存的CSS/JS文件? 我想知道在Symfony中是否有任何内置功能或简单的方法,当它发现JavaScript / CSS文件已被修改时,自动通过附加随机查询字符串或时间戳来强制重新加载链接。 (通常,人们使用use_javascript函数生成<script>标记)
2个回答

3

虽然没有内置机制,但是一些创意可以让你在代码的任何位置实现这个功能,从 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')); ?>

但是这只会在使用include_javascript / include_stylesheet时产生影响。在我的Symfony应用程序中,根本不使用view.yml,而是使用use_javascript和use_stylesheet函数。 - bobo
原则是相同的 - 这些函数实际上是彼此的同义词,只是在不同的上下文中使用(YAML 和 PHP)。在您的情况下,只需使用:``我已经更新了答案并提供了该解决方案。 - Raise
感谢您的帮助。最终,我采纳了您的想法,并修改了框架中AssetHelper.php文件中的javascript_path和stylesheet_path函数,使其成为可能。但是在进行版本升级时,我必须记住这一点。 - bobo

2

不要为每个包含的样式表设置版本,最好自动为所有包含的样式表完成此操作,无论您是使用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;
}

在您的layout.php文件中,在头部区域内调用此代码。请确保没有进一步调用include_stylesheets(),因为这是它的扩展版本。同样的方法也适用于include_javascripts。

我认为这是最好的解决方案,但我只在生产环境中使用了filemtime()。谢谢。 - palmic

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