ang3/doctrine-cache-invalidator-bundle

Doctrine 缓存无效化。

dev-master 2019-07-14 16:47 UTC

This package is not auto-updated.

Last update: 2024-09-15 05:44:34 UTC


README

Build Status Latest Stable Version Latest Unstable Version Total Downloads

一个用于管理 doctrine 结果缓存无效化的 Symfony 包。

安装

步骤 1: 下载 Bundle

打开命令行,进入项目目录,并执行以下命令以下载此 Bundle 的最新稳定版本

$ composer require ang3/doctrine-cache-invalidator-bundle

此命令要求您已全局安装 Composer,如 Composer 文档中的安装章节所述。

步骤 2: 启用 Bundle

然后,通过将其添加到项目 app/AppKernel.php 文件中注册的 Bundle 列表中来启用此 Bundle。

<?php
// app/AppKernel.php

// ...
class AppKernel extends Kernel
{
  public function registerBundles()
  {
    $bundles = array(
      // ...
      new Ang3\Bundle\DoctrineCacheInvalidatorBundle\Ang3DoctrineCacheInvalidatorBundle(),
    );

    // ...
  }

  // ...
}

步骤 3: 配置您的应用程序(可选)

不需要配置,但您可以配置特定的日志记录器。

# app/config/config.yml
ang3_doctrine_cache_invalidator:
  logger: ~ # An optionnal logger ID (Psr/Log/LoggerInterface)

用法

上下文

假设您在 AppBundle\Repository\MyRepository 的仓库类中注册了一个结果缓存 ID。

// src/AppBundle/Repository/MyRepository.php

// ...
$qb
  // ...
  // Get the query
  ->getQuery()
  // Register an ID to invalidate results
  ->setResultCacheId('my_custom_id')
  // Get the result as you want
  ->getResult() # Or what ever
;
// ...

无效化

无效化过程发生在 "flush" 实体操作期间。在每个实体上,调用解析器以定义要删除的潜在缓存索引。为此,您只需在相关的实体上编写一个注解并对其进行配置。

// src/AppBundle/Entity/EntityA.php

// Do not forget the "use" statement
use Ang3\DoctrineCacheInvalidatorBundle\Annotation\CacheInvalidation;
// ...

/**
 * @CacheInvalidation(id="my_custom_id")
 */
class EntityA
{
  // ...
}

选项

CacheInvalidation 注解有三个参数

  • id(必需):要删除的结果缓存 ID
  • parameters(可选):潜在 ID 参数的关联数组(值由一个 表达式 表示)
  • validation(可选):一个 表达式,用于验证特定实体

动态 ID 和参数

在动态结果缓存 ID 的情况下,您可以注册类似于 PHP(使用 $)的变量,但您必须指定 "parameters" 选项下的相关表达式。建议您使用点 . 结束变量名。

// src/AppBundle/Entity/EntityA.php

// Do not forget the "use" statement
use Ang3\DoctrineCacheInvalidatorBundle\Annotation\CacheInvalidation;
// ...

/**
 * @CacheInvalidation(id="my_custom_.$id", parameters={"id":"this.getId()"})
 */
class EntityA
{
  // ...
}

验证

您还可以在处理过程中将实体提交给验证。您只需指定一个表达式,以便返回一个布尔值。如果表达式返回 TRUE 或等效(可转换),则删除结果缓存 ID。

// src/AppBundle/Entity/EntityA.php

// Do not forget the "use" statement
use Ang3\DoctrineCacheInvalidatorBundle\Annotation\CacheInvalidation;
// ...

/**
 * @CacheInvalidation(id="my_custom_.$id", parameters={"id":"this.getId()"}, validation="eventType == 'update'")
 */
class EntityA
{
  // ...
}

表达式

所有使用的表达式都由组件 symfony/expression-language 进行评估。

在评估每个表达式时,传递以下变量

  • this(对象):添加/编辑/删除的实体
  • eventType(字符串)'insert'、'update' 或 'delete'
  • changeSetAng3\Bundle\DoctrineCacheInvalidatorBundle\Helper\EntityChangeSetHelper 的实例

待办事项

  • 使用默认实体管理器以外的实体管理器(在监听器中获取 doctrine 注册表,然后在注解中添加 'entity_manager' 选项并在 flush 操作期间检查实体管理器)!