【问题标题】:Symfony2 assets versioning by fileSymfony2 资产按文件版本控制
【发布时间】:2013-07-21 15:18:48
【问题描述】:

问题

是否可以在 Symfony2 上使用 assets_version by file

背景

我们正在使用 assets_version 和 assets_version_format 来管理文件版本并强制更新 CDN 和浏览器缓存上的缓存。

这很神奇!但是,我们发现所有使用的静态资源只有一个assets_version 参数。

这是一个问题,因为我们的 webapp 拥有大量静态资源,并且我们每天都在部署对 prod 环境的更改。这种情况会杀死缓存。 :(

这是我们当前的配置:

config.yml

framework:
   
    templating:
        engines: ['twig']
        assets_version: %assets_version%
        assets_version_format:  "stv%%2$s/%%1$s"

# Assetic Configuration
assetic:
    debug:          %kernel.debug%
    use_controller: false
    # java: /usr/bin/java
    filters:
         cssrewrite: ~
         closure:
             jar: %kernel.root_dir%/java/compiler.jar
         yui_css:
             jar: %kernel.root_dir%/java/yuicompressor-2.4.6.jar

sometemplate.html.twig

    {% stylesheets 'bundles/webapp/css/funCommon.css'
                       'bundles/webapp/css/funMobile.css'
                       filter='?yui_css'
        %}
        <link rel=stylesheet href='{{ asset_url }}'>
        {% endstylesheets %}
    
    {% javascripts 'bundles/webapp/js/app.js'
                   'bundles/webapp/js/utils.js'
                    filter='?closure'  %}
        <script src="{{ asset_url }}"></script>
        {% endjavascripts %}

{% javascripts 'bundles/webapp/js/moduleX.js'
                   'bundles/webapp/js/utilsX.js'
                    filter='?closure'  %}
        <script src="{{ asset_url }}"></script>
        {% endjavascripts %}

当我更改任何 css 文件或模块JS 或任何其他文件时,所有路径都会更改

我想通过javascript/stylesheet twig标签的参数来管理assets_version_format的版本参数。

这就是我要找的:

{% javascripts 'bundles/webapp/js/app.js'
               'bundles/webapp/js/utils.js'
                filter='?closure' **version='XX'** %}
    <script src="{{ asset_url }}"></script>
    {% endjavascripts %}
  

【问题讨论】:

    标签: php caching symfony twig assets


    【解决方案1】:

    经过多天的搜索,我在AsseticBundle

    上找到了packages选项

    http://symfony.com/doc/2.0/reference/configuration/framework.html#full-default-configuration

    使用该配置选项,我可以执行以下操作:

    {% javascripts file package='packageName' %}
    

    {{asset(file,packageName)}}
    

    示例:

    config.yml

    framework:
    
        templating:
            engines: ['twig']
            assets_version: %assets_version%
            assets_version_format:  "stv%%2$s/%%1$s"
            packages:
                 css:
                    version: 6.1
                    version_format: "stv%%2$s/%%1$s"
                 jsApp:
                    version: 4.2
                    version_format: "stv%%2$s/%%1$s"
    

    sometemplate.html.twig

    <link rel=stylesheet href='{{ asset('bundles/webapp/css/funCommon.css','css') }}'>
    
    {% javascripts 'bundles/webapp/js/app.js'
                   'bundles/webapp/js/utils.js'
                    filter='?closure'
                    package='jsApp'
     %}
        <script src="{{ asset_url }}"></script>
     {% endjavascripts %}
    

    这个的输出是:

    <link rel=stylesheet href="http://static.domain.com/stv6.1/css/HASH.css">
    
    <script src="http://static.domain.com/stv4.2/js/HASH.js"></script>
    

    对我来说,这是按文件管理资产版本的最简单方法。

    【讨论】:

    • 非常好,正是我需要的。
    • 想知道您将使用什么流程来确保在上线时更新版本号?我想知道,因为我开发的大多数应用程序,我们每周都会发布多次更改,每次都必须记住这样做会很痛苦。
    • 不是真的,那是自动的。将其移至预登台和生产的同一脚本会增加静态版本属性。
    【解决方案2】:

    如果您尝试将 assets_version 参数与 javascriptsstylesheets 帮助程序一起使用,您仍然需要使用 资产 helper。

    {% javascripts 'bundles/webapp/app.js'
                   'bundles/webapp/utils.js'
                   filter='?closure' %}
        <script src="{{ asset(asset_url) }}" type="text/javascript"></script>
    {% endjavascripts %}
    

    它不会自动添加到 asset_url(这是一件好事)。

    【讨论】:

    • 非常感谢@rodnaph!不明白为什么没有使用assets_version
    【解决方案3】:

    一个简单快速的解决方法是这样的:

    {% set asset_version = 'xyz' %}
    
    {% javascripts 'bundles/webapp/js/app.js'
               'bundles/webapp/js/utils.js'
                filter='?closure' %}
        <script src="{{ asset_url }}?{{ asset_version }}"></script>
    {% endjavascripts %}
    

    但您可能希望将逻辑移至接收asset_url 作为参数的树枝扩展。

    正常的过程是生成文件的哈希值,然后将其存储在用户缓存中。

    然后,您可以在自定义命令中将所有哈希值与当前哈希值进行比较,并将最新的哈希值或其他内容附加到文件名以强制更新缓存。

    【讨论】:

    • 感谢您的回复。这是我的第一种方法,但我认为可能存在一个插件来避免这个问题。我会帮你延长树枝扩展
    • 我找到了一个开箱即用的实用解决方案。
    【解决方案4】:

    以下解决方案将附加时间戳而不是版本号。重要的是他的时间戳只会在你清除缓存时改变。

    首先创建一个编译器通道:

    <?php
    
    namespace App\Bundle\DependencyInjection\Compiler;
    
    use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
    use Symfony\Component\DependencyInjection\ContainerBuilder;
    use Symfony\Component\DependencyInjection\DefinitionDecorator;
    
    /**
     * Created by PhpStorm.
     * User: hpenny
     * Date: 15/03/17
     * Time: 2:33 PM
     */
    class AssetCompilerPass implements CompilerPassInterface
    {
        /**
         * You can modify the container here before it is dumped to PHP code.
         *
         * @param ContainerBuilder $container
         */
        public function process(ContainerBuilder $container)
        {
            $container->removeDefinition('assets._version__default');
            $decorator = new DefinitionDecorator('assets.static_version_strategy');
            $decorator->replaceArgument(0, time());
            $container->setDefinition('assets._version__default', $decorator);
        }
    }
    

    然后将其添加到您的主包中:

    namespace App\Bundle;
    
    use App\Bundle\DependencyInjection\Compiler\AssetCompilerPass;
    use Symfony\Component\DependencyInjection\ContainerBuilder;
    use Symfony\Component\HttpKernel\Bundle\Bundle;
    
    class AppBundle extends Bundle
    {
        public function build(ContainerBuilder $container)
        {
            parent::build($container);
    
            $container->addCompilerPass(new AssetCompilerPass());
        }
    }
    

    这仅适用于默认资产包。 如果您正在使用该功能,则需要遍历您设置的不同包定义。

    您需要替换 assets._version_&lt;package name&gt; 而不是 assets._version__default

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 2012-04-13
      • 1970-01-01
      相关资源
      最近更新 更多