silverstripe/controllerpolicy

此包已弃用且不再维护。未建议替代包。

SilverStripe模块,提供按控制器策略的框架。包括比框架默认更灵活的缓存策略实现。

安装次数: 56,695

依赖者: 1

建议者: 0

安全: 0

星标: 11

关注者: 8

分支: 9

公开问题: 5

类型:silverstripe-vendormodule

2.2.0 2021-05-04 23:17 UTC

README

此模块已被存档,因为已被Silverstripe框架中的功能所取代。

请通过HTTPCacheControlMiddleware设置HTTP缓存控制头。

控制器策略

摘要

此模块对SilverStripe 3.7+不兼容。 SilverStripe框架中的HTTPCacheControl API提供了更高层次的缓存行为抽象。

概述

此模块旨在提供配置响应策略的能力,这些策略适用于特定的控制器。

它包含一些用于实现缓存的策略

  • CachingPolicy:重写SilverStripe默认的HTTP::add_cache_headers()
  • CustomHeaderPolicy:允许通过配置系统添加任何头信息。

还提供了一个示例页面扩展PageControlledPolicy,它利用CachingPolicy的能力,根据CMS在特定对象上的配置自定义max-age。

安装

使用Composer安装

composer require silverstripe/controllerpolicy ^2

注意:此版本支持SilverStripe 4。对于与SilverStripe 3兼容的版本,请参阅1.x发布分支

策略

简单策略

假设我们只想将最大缓存时间设置为300秒应用于主页。此模块包含一个CachingPolicy,通过实现ControllerPolicy接口可以应用于从Controller派生的任何内容。此类还可以通过(注入的)属性配置以指定自定义的最大缓存时间。

使用此策略通过项目特定的config.yml完成。我们通过依赖注入配置伪单例,并将其直接应用于HomePage_Controller

SilverStripe\Core\Injector\Injector:
  StandardCachingPolicy:
    class: SilverStripe\ControllerPolicy\Policies\CachingPolicy
    properties:
      CacheAge: 300
HomePageController:
  dependencies:
    Policies: '%$StandardCachingPolicy'

每个策略都将设置在默认框架的HTTP::add_cache_headers之上的头信息,这正是我们想要的。这允许我们例如按策略自定义Vary头,这些头之前是硬编码的。它还允许我们按控制器而不是全局默认值来配置这些设置。

忽略域名

如果您希望完全排除某些策略,可以执行以下操作

SilverStripe\ControllerPolicy\ControllerPolicyMiddleware:
  ignore_regex_domains:
    - '/.*\.uat.server.com$/'

例如,如果您希望在测试服务器上禁用缓存,或者如果您正在进行激进的缓存,并希望编辑器立即看到更改的资源,这可能会很有用。

Vary头信息

CachingPolicy还允许通过配置系统自定义Vary头信息。

SilverStripe\Core\Injector\Injector:
  StandardCachingPolicy:
    class: SilverStripe\ControllerPolicy\Policies\CachingPolicy
    properties:
      CacheAge: 300
      Vary: 'Cookie, X-Forwarded-Protocol, Accept-Language'

任何内容依赖于访客触发的URL都应该使用Vary头部来编码这种依赖关系,否则缓存可能会向错误用户(甚至可能是机密数据)提供错误内容!

以下是一些更明显的Vary头部表格。CachingPolicy使用相对安全的组合Cookie, X-Forwarded-Protocol。记住,你指定的这些越多,缓存就越分区,这将抵消潜在的收益。尽可能使用你确信的。

Vary开启 描述 缓存分区影响
Accept-Encoding 根据接受的内容压缩方法Vary - Apache会根据接受的编码提供不同的内容。由Apache mod_header自动添加。
Cookie 根据用户会话Vary。几乎将响应分为通用和个性化。请注意,为了使此功能正常工作,缓存需要从请求中清除前端仅cookie,如__utma。这是一个明智的补充。
X-Forwarded-Protocol 根据协议(如http或https)Vary - 当缓存位于反向代理后面时使用,因为“BaseURL”通常存在差异,但缓存看到的URL中未反映出来。这是一个明智的补充。
X-Forwarded-Proto X-Forwarded-Protocol的变体,选择适合您反向代理的一个。
Accept 根据响应格式Vary。一些URL,尤其是API端点,可以根据用户接受的格式生成不同的输出:即JSON与XML。尽可能避免,并转而在URL中编码内容类型。 中等
Accept-Language 根据接受的语Vary言,如果您根据用户浏览器设置提供不同的语言内容。尽可能避免,并转而在URL中编码语言。 中等
User-Agent 根据用户的设备Vary。这里有很多用户字符串,这将有效地禁用您的缓存。不惜一切代价避免,并转而使用响应式主题。 极端

覆盖策略

如果您将策略应用于特定的Controller,则它也将应用于所有继承的控制器。例如,如果我们有FooPageController extends PageController,那么PageController策略也将影响FooPageController

只要您不使用数组进行配置(您通常不会 - 但请参阅下文“复杂策略”章节),您就可以通过将策略应用于继承的控制器来轻松打破这个链。

FooPageController:
  dependencies:
    Policies: null

在SilverStripe 4中,配置系统允许您设置falsey值,您可以利用这些值来取消已定义的控制器或全局策略。例如,对于基于GET的多步骤表单(通过silverstripe-multiform模块),步骤是通过GET请求遍历的,并且URI没有差异,因此阻止您真正通过表单。

请注意,您也可以使用任何其他策略来覆盖现有的策略 - 您不必仅取消它。

PageControlledPolicy

以下是如何实现CMS能力以覆盖特定页面的max-age的示例。在您的配置文件中添加以下语句

SilverStripe\Core\Injector\Injector:
  GeneralCachingPolicy:
    class: SilverStripe\ControllerPolicy\Policies\CachingPolicy
    properties:
      CacheAge: 900

PageController:
  dependencies:
    Policies: '%$GeneralCachingPolicy'

Page:
  extensions:
    - SilverStripe\ControllerPolicy\PageControlledPolicy

在这里,将PageControlledPolicy扩展应用于Page会导致在数据库中写入新的“MaxAge”字段,并出现新的选项卡(“缓存”),允许管理员用户调整缓存max-age头部(以分钟为单位)。

通过数组合并的复杂策略

此示例说明了配置系统数组合并功能的用法,这将使您能够模拟策略继承,从而反映您的类图。

在此示例中,我们希望配置一个包含两个策略的全局设置,一个设置max-age为300,另一个配置自定义头。然后我们希望为主页max-age添加更具体的策略,同时保留自定义头。以下是使用配置系统实现此操作的方法

SilverStripe\Core\Injector\Injector:
  ShortCachingPolicy:
    class: SilverStripe\ControllerPolicy\Policies\CachingPolicy
    properties:
      CacheAge: 300
  LongCachingPolicy:
    class: SilverStripe\ControllerPolicy\Policies\CachingPolicy
    properties:
      CacheAge: 3600
  CustomPolicy:
     class: SilverStripe\ControllerPolicy\Policies\CustomHeaderPolicy
     properties:
       Headers:
         Custom-Header: "Hello"
         
HomePageController:
  dependencies:
    Policies:
      LongCachingPolicy: '%$LongCachingPolicy'
      
PageController:
  dependencies:
    Policies:
      ShortCachingPolicy: '%$ShortCachingPolicy'
      CustomPolicy: '%$CustomPolicy'

主页数组合并的结果如下

  • LongCachingPolicy
  • ShortCachingPolicy
  • CustomPolicy

我们按反向顺序处理此数组,这意味着默认情况下,最顶端的策略(最具体的Controller)将覆盖其他策略。这并不意味着会触发许多Controller策略,而是只有一个Controller将应用合并后的集合。

注意:您可以使用数组语法或值语法。选择更简单的一种。如果使用数组,我们建议为每个值也提供一个键,这将允许您在其他配置块中取消之前定义的值,否则这是不可能的。

开发人员备注

对于策略的高级使用(例如,提前返回304头),您可以查看ControllerPolicyMiddleware::process方法。在这种情况下,您的自定义策略可以从其applyToResponse方法中用带有304代码的新HTTPResponse替换HTTPResponse $response参数。

另一件事是,策略将按照初始化时的Controller顺序应用,因此如果调用多个Controller,后者将覆盖前者。但是,这种情况非常不可能,并且与类的继承无关。这关系到SilverStripe中Controller堆栈的调用方式。《ControllerPolicyApplicator》中的扩展点已选择,以便ModelAsControllerRootURLController不会触发策略的应用,并且预计只有一个Controller会触发策略。