Contributed by
Ryan Weaver in #22046.

Asset组件 的一个主要功能,就是具有管理程序资源的版本的能力。Asset versions通常用于控制这些资源应如何被缓存。例如,如果你为自己的assets定义了如下配置:

1
2
3
4
5
# app/config/config.yml
framework:
    # ...
    assets:
        version: 'v2'

然后在模板中使用了 asset() 功能来引用你的资源:

1
<img src="{{ asset('images/logo.png') }}" />

那么,为图片所生成的URL将会是 /images/logo.png?v2。这是由 StaticVersionStrategy 类所管理的,它是由Asset提供的内置版本策略(versioning strategies)之一。

在query string中附有某些可以改变的值的静态策略(static strategies)已经淡出,因此开发者需要 使用自定义的Assets版本策略 以便跟上asset versioning的发展趋势。

这就是为什么在Symfony 3.3中我们决定添加一个 全新的基于JSON文件清单的版本策略。这是可被诸如 Webpack 等人气工具所使用的策略,它生成的是一个映射有“全部资源文件名及其相应的输出文件”的JSON文件,例如:

1
2
3
4
5
{
    "css/app.css": "build/css/app.b916426ea1d10021f3f17ce8031f93c2.css",
    "js/app.js": "build/js/app.13630905267b809161e71d0f8a0c017b.js"
    "...": "..."
}

路径中的随机字符部分在Webpack中被称为“chunk hash”,它是文件内容的加密。对于长期化的资源缓存来说此为最佳策略,因为这个hash,连同资源路径,将在你于asset文件中做出任何修改时立即改变,并击碎(busting)任何既存的缓存。

为了能在Symfony程序中使用此策略,定义一个全新的 json_manifest_path asset配置选项:

1
2
3
4
5
# app/config/config.yml
framework:
    # ...
    assets:
        json_manifest_path: '%kernel.root_dir%/../web/build/manifest.json'

然后,像以前一样,继续使用 asset() 模板函数:

1
<link href="{{ asset('/css/app.css') }}">

新的版本策略将把链接转换为 <link href="/build/css/app.b916426ea1d10021f3f17ce8031f93c2.css">,并且将在你改变原始asset文件时立即更新。