kaingnx / reference-cache-trait
CakePHP 特性,用于缓存常用参考数据/实体。
Requires
- php: >=5.6
- cakephp/cakephp: 3.8.*
Requires (Dev)
- phpunit/phpunit: 5.*
This package is auto-updated.
Last update: 2024-09-29 05:48:42 UTC
README
此特性旨在与 CakePHP 实体类一起使用,用于缓存常用参考表,例如城市、州、邮政编码或国家。使用此特性需要几个步骤和一些基本配置。
此特性的预期用途是为那些原本必须反复查询参考表数据的实体,由于为每个创建的实体添加额外的查询而变得非常缓慢,甚至可能是指数级的。
此特性将基于使用此特性的实体命名空间缓存整个参考表,然后在其中包含一个名为 'entities' 的数组来缓存实体的命名空间。
缓存列表不会直接存储在其命名空间下,以便在未来需要时在该命名空间中存储并行属性。
用法
- 将
use KainGNX\Model\Entity\Traits\ReferenceCacheTrait添加到所需类的顶部。 - 覆盖使用此特性将构造的实体构造函数
- 在父构造函数回调之后,使用传递的定义列表调用
$this->initReferenceCache([]) - 确保定义列表符合
$this->referenceDefinition的模式,见注释 - 要获取缓存中的属性列表,请在需要的实体中调用
$this->getCachedEntities('DefinitionKey') - 确保 '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