silverstripe / controllerpolicy
SilverStripe模块,提供按控制器策略的框架。包括比框架默认更灵活的缓存策略实现。
Requires
- silverstripe/framework: ^4.2
Requires (Dev)
This package is auto-updated.
Last update: 2022-04-16 01:26:03 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》中的扩展点已选择,以便ModelAsController
和RootURLController
不会触发策略的应用,并且预计只有一个Controller会触发策略。