webfactory/wfdmeta-bundle

这是一个查询 wfd_meta 表并用于 ConfigCache 过期的捆绑包。作为示例代码很有用,请参阅 README 文件。

4.2.0 2024-09-04 14:20 UTC

README

这是什么垃圾?

此捆绑包提供服务和工具,用于处理由 wfDynamic 内容管理系统 跟踪的内容元数据。这些数据保存在名为 wfd_meta 的数据库表中。其中包含创建、最后更新和可能的删除所有管理记录的时间戳。

我们开源它并不是为了直接使用:您可能没有这个捆绑包所需的必要信息。

我们更认为它可能对那些考虑类似解决方案的人有用。特别是使用自定义 ConfigCacheFactory 实现、自定义数据库感知资源和使 Controller 结果可缓存的注解,可能是如何将 Symfony 框架 中的细节钩入以实现更专用功能的有趣示例。

此捆绑包公开的服务和 API

以下部分尝试描述捆绑包的公共 API 部分。其他所有内容都应被视为您不应该干涉的移动部件。

webfactory_wfd_meta.provider 服务

一个 \Webfactory\Bundle\WfdMetaBundle\Provider 的实例,可以用来查询一个或多个通过它们的表名或 wfDynamic 表 ID 标识的表的最后更改(更改或删除)时间戳。也可以用来查询单个数据库行的此信息。

特殊表名 * 表示 "任何更改/表"。

\Webfactory\Bundle\WfdMetaBundle\MetaQuery

当知道要跟踪什么更改的代码与执行该信息的代码分布式或不同时,使用 MetaQuery 来分离关注点。更具体地说,一个或多个客户端可以调用 MetaQuery 来添加 Doctrine 实例、实体类、数据库表名或 wfDynamic 表 ID 以跟踪更改。然后,可以将查询传递下去,最终执行它。再次强调,特殊表名 * 表示 "任何表"。

为特定目的创建 MetaQuery 实例作为 DIC 服务;您可以通过继承抽象的 webfactory_wfd_meta.meta_query 服务来做到这一点。或者,调用 webfactory_wfd_meta.meta_query_factory 服务的 create() 方法。

基于 wfd_meta 数据的 HTTP 缓存验证

由于我们希望允许多个 "资源监视器" 的组合 - 例如,一个监视 wfdMeta 数据,一个监视非 wfd-meta-tracked 数据,一个监视例如日期(用于在特定日期重置),因此已弃用 Send304IfNotModified 注解。

此外,我们希望反转依赖方向:缓存捆绑包应能够使用 wfdMetaBundle(以及许多其他捆绑包),但 wfdMetaBundle 不应负责缓存。

这导致了在新的 WebfactoryHttpCacheBundle 中的 "最后修改确定器" 概念。

您可以使用 WfdMetaQueries 快速将已弃用的 Send304IfNotModified 注释转换为 LastModifiedDeterminator。这种转换并不完全遵循 LastModifiedDeterminators 的概念(特别是使用 resetInterval 时;请参阅组件的说明),但如果您急于完成任务,可能不想为此分心。

使用 resetInterval

该注释包含一个名为 resetInterval 的附加设置,默认为 2419200 秒(28天)。

由该注释添加的 Last-Modified 标头将移动到最近的(过去的)该值的倍数。这实际上使得响应看起来永远不会比给定的间隔更旧,并在该间隔过期后(即使没有在 wfd_meta 中记录任何更改),也会使缓存过期(并重新运行控制器一次)。

当您知道您的响应依赖于可以通过 wfd_meta 跟踪的数据时,这非常有用,但它还包括(计算)随时间变化的元素。例如,将 resetInterval 设置为 3600,以每小时生成一次响应,尽可能使用缓存的响应,但一旦 wfd_meta 跟踪到变化,则立即重新生成响应。

webfactory_wfd_meta.controller.template:templateAction 控制器作为服务

就像 FrameworkBundle:Template-Controller 一样,这可以用于渲染不需要任何额外控制器处理的任意 Twig 模板。但是,除了基本的缓存属性外,还可以添加 wfd_meta 设置和变更跟踪。以下是一个示例

# routing.yml
# At /demo, render the MyBundle:Foo:bar.html.twig template. Keep the response in public caches, revalidating it every 10s. Whenever wfd_meta tracks any change, generate a fresh response.
demo:
    path: /demo
    defaults:
        _controller:  webfactory_wfd_meta.controller.template:templateAction
        template:     'MyBundle:Foo:bar.html.twig'
        sharedAge:    10
        metaTables:   *

\Webfactory\Bundle\WfdMetaBundle\Util\CriticalSection 工具类

此类实现了一个 临界区。当两个进程(在同一台机器/主机上)可能进行干扰操作或尝试执行相同操作时,请使用它。临界区将允许一个进程执行,并阻止其他进程,直到第一个进程完成任务。

自定义 ConfigCacheFactory 实现和专用资源类型

在完整的 Symfony 框架中,几个组件使用 ConfigCache 机制来缓存成本高昂的生成内容。这包括翻译目录以及 URL 路由器和匹配器组件。

此组件添加了两种新的资源类型,\Webfactory\Bundle\WfdMetaBundle\Config\DoctrineEntityClassResource\Webfactory\Bundle\WfdMetaBundle\Config\WfdTableResource。当您根据数据库内容生成翻译或路由时,将这些资源的实例添加到类(如 MessageCatalogue(翻译组件)或 RouteCollection(路由组件))中。

此组件将替换或更确切地说:装饰 config_cache_factory 服务实现。它将包括对新资源类型的检查,并确保在 wfd_meta 中跟踪到相关更改时刷新缓存。这将在 kernel.debug = false 时发生,即在生产模式下!

临界区将用于确保一次只有一个进程尝试重新创建缓存,而其他进程则等待并重用结果。

配置

此组件只有一个配置设置

# config_test.yml
webfactory_wfd_meta:
    always_expire_wfd_meta_resources: true

使用此设置,包含 WfdMetaResource 实例的 ConfigCache 实例(如 Symfony 路由器、翻译器等)将立即过期。

这有助于例如在功能测试中,其中您有数据库支持的路线、翻译或类似内容:您可以更改数据库值,而不再需要考虑 ConfigCaches 或戳 wfd_meta 以使更改生效。

测试

使用以下命令运行测试

vendor/bin/phpunit

致谢、版权和许可

此项目始于 webfactory GmbH,波恩。

版权所有 2015-2023 webfactory GmbH,波恩。代码在 MIT 许可证 下发布。