【问题标题】:How is the force reload of javascript/css done in Symfony?Symfony 中如何强制重新加载 javascript/css?
【发布时间】:2011-01-21 01:15:56
【问题描述】:

阅读本帖后:How to force browser to reload cached CSS/JS files?

我想知道 Symfony 中是否有任何内置函数或简单方法,当它发现 javascript / css 文件已被修改时,它会通过向链接附加随机查询字符串或时间戳来自动强制重新加载。 (通常人们使用use_javascript函数来生成<script>标签)

【问题讨论】:

    标签: php javascript css caching symfony-1.4


    【解决方案1】:

    没有内置机制,但一点创意意味着您可以在代码中的任何位置执行此操作,从 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') ?>]
    

    app_project_versionapps/frontend/config/app.yml 中设置。 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 函数。
    • 原理是一样的——这些函数实际上是彼此的同义词,只是在不同的上下文中使用(YAML 和 PHP)。在您的情况下,只需使用:&lt;?php use_stylesheet('blah?v='.sfConfig::get('app_version')); ?&gt; 我已使用此解决方案更新了答案。
    • 感谢您的帮助。最后,我采纳了你的想法,修改了框架的 AssetHelper.php 中的 javascript_path 和 stylesheet_path 函数,使之成为可能。但是在进行版本升级时我必须牢记这一点。
    【解决方案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() 和 prod env 中使用它。谢谢
    猜你喜欢
    • 2017-05-12
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多