kaingnx/reference-cache-trait

CakePHP 特性,用于缓存常用参考数据/实体。

安装: 0

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 0

类型:插件

dev-master 2019-10-01 17:00 UTC

This package is auto-updated.

Last update: 2024-09-29 05:48:42 UTC


README

此特性旨在与 CakePHP 实体类一起使用,用于缓存常用参考表,例如城市、州、邮政编码或国家。使用此特性需要几个步骤和一些基本配置。

此特性的预期用途是为那些原本必须反复查询参考表数据的实体,由于为每个创建的实体添加额外的查询而变得非常缓慢,甚至可能是指数级的。

此特性将基于使用此特性的实体命名空间缓存整个参考表,然后在其中包含一个名为 'entities' 的数组来缓存实体的命名空间。

缓存列表不会直接存储在其命名空间下,以便在未来需要时在该命名空间中存储并行属性。

用法

  1. use KainGNX\Model\Entity\Traits\ReferenceCacheTrait 添加到所需类的顶部。
  2. 覆盖使用此特性将构造的实体构造函数
  3. 在父构造函数回调之后,使用传递的定义列表调用 $this->initReferenceCache([])
  4. 确保定义列表符合 $this->referenceDefinition 的模式,见注释
  5. 要获取缓存中的属性列表,请在需要的实体中调用 $this->getCachedEntities('DefinitionKey')
  6. 确保 'DefinitionKey' 与 $this->referenceDefinition 中结构化的属性元素匹配

需要 DefinitionKey 的原因是支持每个实体有多个缓存列表。这是因为特性不能被扩展,使用它的实体将共享相同的方法和属性实例。

参考缓存定义

必须定义使用此特性的实体构造函数。用于定义每个表及其实体的缓存选项

参考缓存定义示例

必需::: 为 ReferenceCacheTrait::cacheDefinition 数组的每个元素使用以下模式。在覆盖此特性将使用的实体构造函数后,执行类似以下示例的操作。可以添加多个项目。

    $this->initReferenceCache(
        'States' => [
            'tableRegistryAlias' => 'Cities',
            'entityNamespace' => 'App.Model.Entity.EntityName',
            'referenceProperty' => 'property_name',
            'keyField' => 'field_name_of_entity', 
            'conditions' => []
        ]
    );

添加参考定义之后

只需执行以下操作,它将合并到现有定义中。再次,可以添加多个项目。

    $this->addReferenceDefinition(
        'MoreStates' => [
            'tableRegistryAlias' => 'MoreCities',
            'entityNamespace' => 'App.Model.Entity.EntityName',
            'referenceProperty' => 'property_name',
            'keyField' => 'field_name_of_entity', 
            'conditions' => []
        ]
    );
参考缓存定义属性

为了保持一致性并遵循 CakePHP 的一致性,每个缓存定义应通过复数表名作为键。

  • tableRegistryAlias:要缓存的实体的 CakePHP 表别名
  • entityNamespace:用于在缓存中存储实体的数组键,使用实体点命名空间
  • referenceProperty:用于从缓存中拉取的实体属性,例如外键或所选字段
  • keyField:返回实体键值字段的名称
  • conditions:选择实体的条件

使用缓存特性的任何实体,到缓存子实体的路径将是父实体命名空间,斜杠被点替换,然后使用点替换斜杠的子实体命名空间。

entityNamespace 可以从表对象实例中推导出来,最好直接传递,这样就不必为每个实体创建表来查找和转换该值,即使缓存也是如此。

为了避免缓存冲突,并维护 conditions 的上下文,当缓存时,所有实体都将缓存在一个点命名空间中,反映参考缓存的父类。

从缓存根的示例

App.Model.Entity.ParentEntity' => 'App.Model.Entity.ChildEntity' => ['entities'] => \App\Model\Entity\ChildEntity[]

例如,州是城市的前置实体,这将是缓存实体在 \Cake\Cache\Cache 中的数组路径。

App.Model.Entity.States => App.Model.Entity.Cities => entities