资产组成部分

资产组成部分<一个类="headerlink" href="#the-asset-component" title="¶">¶

Asset组件管理web资产(如CSS样式表、JavaScript文件和图像文件)的URL生成和版本控制。

在过去,web应用程序对web资产的url进行硬编码是很常见的。例如:

1 2 3 4 5
<链接rel=“样式表”类型=“文本/ css”HREF.=“/ css / main.css”><! -  ...  - ><一个HREF.=“/”><imgSRC.=“/图片/ logo.png”alt.=“标志”>一个>

除非web应用程序非常简单,否则不再推荐这种做法。硬编码url可能是一个缺点,因为:

  • 模板变得冗长:您必须为每个资产编写完整路径。使用资产组件时,您可以在包中分组资产以避免重复其路径的共同部分;
  • 版本控制很难:它必须为每个应用程序自定义管理。添加一个版本(例如。main.css吗?v = 5)到资产的url对于某些应用程序是必不可少的,因为它允许您控制如何缓存资产。Asset组件允许您为每个包定义不同的版本控制策略;
  • 动资产的位置很繁琐,容易出错:它要求您仔细更新所有模板中包含的所有资产的URL。资产组件允许毫不费力地通过改变与资产包相关联的基本路径值来移动资产;
  • 使用多个cdn几乎是不可能的:此技术要求您随时为每个请求更改资产的URL。资产组件为任意数量的多个CDN提供外开箱支持(http://)和安全(https://)。

安装<一个类="headerlink" href="#installation" title="¶">¶

1
美元作曲家需要symfony /资产欧宝娱乐app下载地址

请注意

如果在Symfony应用程序之外安装此组件,则必须使用欧宝娱乐app下载地址供应商/ autoload.php代码中的文件以启用Composer提供的类自动加载机制。读<一个类="reference internal" href="//www.oldmanjams.com/doc/5.2/components/using_components.html">这篇文章为更多的细节。

使用<一个类="headerlink" href="#usage" title="¶">¶

资产包<一个类="headerlink" href="#asset-packages" title="¶">¶

Asset组件通过包管理资产。包对所有共享相同属性的资产进行分组:版本控制策略、基本路径、CDN主机等。在下面的基本示例中,创建一个包来管理资产,而不需要任何版本控制:

欧宝娱乐app下载地址Symfony \资产\ \组件包;欧宝娱乐app下载地址Symfony \组件\ \ VersionStrategy \ EmptyVersionStrategy资产;美元的包=新的包裹(新的EmptyVersionStrategy());/ /绝对路径回声美元的包- >getUrl(' / image.png ');/ /结果:/ image.png/ /相对路径回声美元的包- >getUrl(“image.png”);//结果:image.png

方案实施欧宝娱乐app下载地址symfony \ component \ asset \ packageInterface,它定义以下两种方法:

getVersion()
返回资产的资产版本。
Geturl()
返回绝对或根相对的公共路径。

使用包装,您可以:

  1. 版本的资产;
  2. 设置A.<一个类="reference internal" href="#component-assets-path-package">常见的基本路径(如。/ css)为资产;
  3. 配置CDN.的资产

版本化的资产<一个类="headerlink" href="#versioned-assets" title="¶">¶

资产组件的主要功能之一是管理应用程序资产的版本控制的能力。资产版本通常用于控制这些资产如何缓存。

资产组件而不是依赖于简单的版本机制,而不是通过PHP类定义高级版本控制策略。这两个内置策略是欧宝娱乐app下载地址Symfony \组件\ \ VersionStrategy \ EmptyVersionStrategy资产,这不会向资产添加任何版本欧宝娱乐app下载地址Symfony \组件\ \ VersionStrategy \ StaticVersionStrategy资产,它允许您使用格式字符串设置版本。

在本例中StaticVersionStrategy用于附加v1后缀到任何资产路径:

欧宝娱乐app下载地址Symfony \资产\ \组件包;欧宝娱乐app下载地址Symfony \组件\ \ VersionStrategy \ StaticVersionStrategy资产;美元的包=新的包裹(新的StaticVersionStrategy(“v1”));/ /绝对路径回声美元的包- >getUrl(' / image.png ');/ /结果:/ image.png吗?v1/ /相对路径回声美元的包- >getUrl(“image.png”);//结果:image.png?v1

如果您想修改版本格式,请传递asprintf-compatible格式字符串作为第二个参数StaticVersionStrategy构造函数:

//将'version'置于版本值之前美元的包=新的包裹(新的StaticVersionStrategy(“v1”,'%s?版本=%s'));回声美元的包- >getUrl(' / image.png ');//结果:/image.png?version=v1//将资产版本放在路径之前美元的包=新的包裹(新的StaticVersionStrategy(“v1”,'%2 $ s /%1 $ s'));回声美元的包- >getUrl(' / image.png ');//结果:/v1/image.png回声美元的包- >getUrl(“image.png”);//结果:v1 / image.png

JSON文件清单<一个类="headerlink" href="#json-file-manifest" title="¶">¶

管理资产版本管理的一个流行策略,它被工具使用<一个类="reference external" href="https://webpack.js.org/">Webpack,是生成JSON文件将所有源文件名映射到它们对应的输出文件:

1 2 3 4 5
{“css / app.css”:“构建/ CSS / APP.B916426EA1D10021F3F17CE8031F93C2.css”,“js / app.js”:“构建/ js / app.13630905267b809161e71d0f8a0c017b.js”,“…”:“…”}

在这些情况下,使用欧宝娱乐app下载地址Symfony \组件\ \ VersionStrategy \ JsonManifestVersionStrategy资产:

欧宝娱乐app下载地址Symfony \资产\ \组件包;欧宝娱乐app下载地址Symfony \组件\ \ VersionStrategy \ JsonManifestVersionStrategy资产;//假设上面的JSON文件称为“Rev-Manifest.json”美元的包=新的包裹(新的jsonmanifestversionstrategy.(__dir__'/rev-manifest.json'));回声美元的包- >getUrl(“css / app.css”);/ /结果:构建/ css / app.b916426ea1d10021f3f17ce8031f93c2.css

如果您的JSON文件不在本地文件系统上,但可以通过HTTP访问,请使用欧宝娱乐app下载地址Symfony \组件\ \ VersionStrategy \ RemoteJsonManifestVersionStrategy资产与之<一个类="reference internal" href="//www.oldmanjams.com/doc/5.2/http_client.html">httpclient组件:

欧宝娱乐app下载地址Symfony \资产\ \组件包;欧宝娱乐app下载地址Symfony \组件\ \ VersionStrategy \ RemoteJsonManifestVersionStrategy资产;欧宝娱乐app下载地址Symfony \ \ HttpClient \ HttpClient组件;$ httpclient.=HttpClient::创建();manifestUrl美元='https://cdn.example.com/rev-manifest.json';美元的包=新的包裹(新的remotejsonmanifestversionstrategy.(manifestUrl美元,$ httpclient.));

5.1版中的新增功能:remotejsonmanifestversionstrategy.在Symfony 5.1中引入。欧宝娱乐app下载地址

自定义版本策略<一个类="headerlink" href="#custom-version-strategies" title="¶">¶

使用欧宝娱乐app下载地址symfony \ component \ asset \ versions ustrongy \ versions ustroly interyface定义自己的版本控制策略。例如,你的应用程序可能需要添加当前日期到所有的web资产,以便每天打破缓存:

欧宝娱乐app下载地址symfony \ component \ asset \ versions ustrongy \ versions ustroly interyface;dateversionstrategy.实施VersionStrategyInterface{私人美元的版本;公共功能__construct(){$这一点- >版本=日期(“Ymd”);}公共功能getVersion.(细绳美元的路径){返回$这一点- >版本;}公共功能applyVersion(细绳美元的路径){返回sprintf(' % s ?v = % s ',美元的路径,$这一点- >getVersion.(美元的路径));}}

分组的资产<一个类="headerlink" href="#grouped-assets" title="¶">¶

通常,许多资产在一个共同的道路下生活(例如/静态/图像)。如果是这种情况,则替换默认值欧宝娱乐app下载地址Symfony \资产\ \组件包欧宝娱乐app下载地址Symfony \ \资产\ PathPackage组件为了避免一遍又一遍地重复这条路:

欧宝娱乐app下载地址Symfony \ \资产\ PathPackage组件;// ......pathPackage美元=新的PathPackage('/静态/图像',新的StaticVersionStrategy(“v1”));回声pathPackage美元- >getUrl('logo.png');/ /结果:/静态/图片/ logo.png吗?v1//使用绝对路径时忽略基本路径回声pathPackage美元- >getUrl(' / logo.png ');//结果:/logo.png?v1

请求上下文感知资产<一个类="headerlink" href="#request-context-aware-assets" title="¶">¶

如果您也使用了<一个类="reference internal" href="//www.oldmanjams.com/doc/5.2/components/http_foundation.html">httpfoundation组件(例如,在Symfony应用程序中)中的欧宝娱乐app下载地址PathPackage类可以考虑当前请求的上下文:

欧宝娱乐app下载地址Symfony \组件\ \环境\ RequestStackContext资产;欧宝娱乐app下载地址Symfony \ \资产\ PathPackage组件;// ......pathPackage美元=新的PathPackage('/静态/图像',新的StaticVersionStrategy(“v1”),新的RequestStackContext(requestStack美元));回声pathPackage美元- >getUrl('logo.png');/ /结果:/ /静态图像的某个地方/ logo.png吗?v1//当使用绝对路径时,"base path"和"base url"都被忽略回声pathPackage美元- >getUrl(' / logo.png ');//结果:/logo.png?v1

现在请求上下文设置,PathPackage将添加当前请求库URL。因此,例如,如果您的整个网站托管在下面/某处您的web服务器根目录的目录和配置的基本路径是/静态/图像,所有路径都将以前缀为前缀/ /静态图像的地方

绝对资产和CDN<一个类="headerlink" href="#absolute-assets-and-cdns" title="¶">¶

在不同的域和cdn上托管资产的应用程序(内容交付网络)应该使用欧宝娱乐app下载地址Symfony \ \资产\ UrlPackage组件类生成其资产的绝对url:

欧宝娱乐app下载地址Symfony \ \资产\ UrlPackage组件;// ......urlPackage美元=新的Urlpackage.(“http://static.example.com/images/”,新的StaticVersionStrategy(“v1”));回声urlPackage美元- >getUrl(' / logo.png ');//结果:http://static.example.com/images/logo.png?v1

您还可以通过架构无神不可播的URL:

欧宝娱乐app下载地址Symfony \ \资产\ UrlPackage组件;// ......urlPackage美元=新的Urlpackage.(' / / static.example.com/images/ ',新的StaticVersionStrategy(“v1”));回声urlPackage美元- >getUrl(' / logo.png ');/ /结果:/ / static.example.com/images/logo.png ? v1

这很有用,因为如果访问者使用HTTPS访问您的站点,资产将自动通过HTTPS请求。如果您想使用此功能,请确保您的CDN主机支持HTTPS。

如果您提供来自多个域的资产以提高应用程序性能,则将url数组作为第一个参数传递给Urlpackage.构造函数:

欧宝娱乐app下载地址Symfony \ \资产\ UrlPackage组件;// ......$ url=(' / / static1.example.com/images/ ',' / / static2.example.com/images/ ',];urlPackage美元=新的Urlpackage.($ url,新的StaticVersionStrategy(“v1”));回声urlPackage美元- >getUrl(' / logo.png ');/ /结果:http://static1.example.com/images/logo.png?v1回声urlPackage美元- >getUrl(' /程序');//结果:http://static2.example.com/images/icon.png?v1

对于每个资产,其中一个url将被随机使用。但是,选择是确定的,这意味着每个资产将始终由相同的领域提供服务。这种行为简化了HTTP缓存的管理。

请求上下文感知资产<一个类="headerlink" href="#id1" title="¶">¶

与应用相对资产类似,绝对资产也可以考虑当前请求的上下文。在这种情况下,仅考虑请求方案,以便选择适当的基本URL(用于HTTPS请求的HTTPS或协议相对URL,HTTP请求的任何基本URL):

欧宝娱乐app下载地址Symfony \组件\ \环境\ RequestStackContext资产;欧宝娱乐app下载地址Symfony \ \资产\ UrlPackage组件;// ......urlPackage美元=新的Urlpackage.((“http://example.com/”,“https://example.com/”),新的StaticVersionStrategy(“v1”),新的RequestStackContext(requestStack美元));回声urlPackage美元- >getUrl(' / logo.png ');//假设RequestStackContext说我们在安全主机上/ /结果:https://example.com/logo.png?v1

命名包裹<一个类="headerlink" href="#named-packages" title="¶">¶

管理许多不同资产的应用程序可能需要使用相同的版本控制策略和基本路径将它们分组到包中。Asset组件包括欧宝娱乐app下载地址symfony \ component \ asset \ packages类来简化几个包的管理。

在以下示例中,所有包都使用相同的版本控制策略,但它们都有不同的基础路径:

欧宝娱乐app下载地址Symfony \资产\ \组件包;欧宝娱乐app下载地址symfony \ component \ asset \ packages;欧宝娱乐app下载地址Symfony \ \资产\ PathPackage组件;欧宝娱乐app下载地址Symfony \ \资产\ UrlPackage组件;// ......$ Versionstrategy.=新的StaticVersionStrategy(“v1”);$ DefaultPackage.=新的包裹($ Versionstrategy.);$ namedpackages=('img'= >新的Urlpackage.(“http://img.example.com/”,$ Versionstrategy.),“医生”= >新的PathPackage(/ /深度/地方/文档的,$ Versionstrategy.),];美元的包=新的($ DefaultPackage.,$ namedpackages);

类允许定义默认包,该包将应用于不定义要使用的包名称的资产。此外,此应用程序定义了一个名为的包img提供来自外部域和医生包,以避免在模板内链接到文档时重复长路径:

回声美元的包- >getUrl('/main.css');/ /结果:/ main.css吗?v1回声美元的包- >getUrl(' / logo.png ','img');/ /结果:http://img.example.com/logo.png?v1回声美元的包- >getUrl(“resume.pdf”,“医生”);/ /结果:/ /深度/地方/文件/ resume.pdf吗?v1

本地文件和其他协议<一个类="headerlink" href="#local-files-and-other-protocols" title="¶">¶

除了HTTP此组件还支持其他协议(例如文件://ftp://)。这允许例如为本地文件提供服务,以提高性能:

欧宝娱乐app下载地址Symfony \ \资产\ UrlPackage组件;// ......localPackage美元=新的Urlpackage.('文件:///路径/到/图像/',新的EmptyVersionStrategy());$ ftpackage.=新的Urlpackage.(“ftp://example.com/images/”,新的EmptyVersionStrategy());回声localPackage美元- >getUrl(' / logo.png ');/ /结果:文件:/ / / / /图片/ logo.png路径回声$ ftpackage.- >getUrl(' / logo.png ');/ /结果:ftp://example.com/images/logo.png

学到更多<一个类="headerlink" href="#learn-more" title="¶">¶

这项工作,包括代码样本,是在一个<一个rel="license" href="https://creativecommons.org/licenses/by-sa/3.0/">创作共用BY-SA 3.0许可证。