kanopi/components

Kanopi 模块化组件模式,用于相关 PHP 库、插件、主题等

1.13.0 2024-04-29 22:13 UTC

README

PHP 库,提供构建其他应用的通用模型和服务模式

文档参考

定义

  • 实体 - 任何表示通过系统流动的数据的结构化模型、类、接口等。模型包含具有自由格式和索引内容的字段集。例如,一个表示带有自由格式地址和索引区域或州的地点的帖子类型或节点。
  • 实体迭代器 - PHP 迭代器,它接受一个类、接口或标量类型,并验证每个成员实体是否为请求的类型
  • 索引实体 - 任何使用数值索引的实体,例如,WordPress 中的帖子类型使用帖子 ID,其索引。
  • 索引组实体 - 可能语法有误,这是与索引实体关联的组,例如与地点关联的城市/区域分类。
  • 读取器 - 只允许读取的数据存储库
  • 存储库 - 存储数据的通用名称,可以是 CSV 文件、HTTP/S 端点、数据库等。
  • 集合 - 相似数据的分组,通常期望在这个系统中为同一实体,使用实体迭代器强制执行
  • - 存储库之间的数据流,此系统实现流以从源存储库读取并将数据写入目标存储库
  • 写入器 - 允许读取/写入的数据存储库

结构

所有结构都存储在 PSR-4 命名空间 Kanopi\Components 下。

命令

命名空间: Kanopi\Components\Commands

一组常用 CLI 命令,可用于注册和使用在 WordPress 中,未来也可能在 Drupal 中使用。

对于 WordPress,所有命令都是针对 WPCLI 的,可以通过调用 Kanopi\Components\Commands\Registration::WPCLICommands() 从此库中注册。

记录器

命名空间: Kanopi\Components\Logger

ILogger 是包装和代理不同日志方法的接口。使用多重复用将日志记录到多个日志目标。

模型

命名空间: Kanopi\Components\Model

功能组件(如存储库和服务)使用的数据结构提供有效、数据转换和异常的集合/迭代器模式。

提供一组异常类以进行标准交互,请根据您的用例添加自定义异常或使用此内容。

处理器

命名空间: Kanopi\Components\Processor

直接组件,用于模拟整个导入、导出或其他过程。这存在是为了协调多个存储库、服务和转换器的努力。它将包含业务规则,以规定数据如何在每个服务或存储库组件中转换和存储。

存储库

命名空间: Kanopi\Components\Repositories

在具体类之前直接 I/O 操作的接口。此命名空间旨在模式化与直接来源(如数据库、文件等)的交互。

这,加上依赖注入,允许通过向其他服务(例如,提供由数组/迭代器支持的模拟数据存储库)提供模拟数据来模拟其他测试,例如服务。

针对 ISetReader,WP_Query 和 WP Post Meta 有具体的实现。其他接口,如 ISetStreamIStreamReader,旨在包装外部数据源(如 CSV 或 JSON 文件)的数据接口。

服务

命名空间Kanopi\Components\Services

接口用于协调外部数据源到本地系统资源的数据处理。

转换器

命名空间Kanopi\Components\Transformers

组件用于整合并简化标准/标量数据类型到协调的数据结构,以便更易于阅读和简洁的功能。例如,字符串工具可以清理或转换分隔符。

代码质量

PHPCS

本项目提供了一种 PHPCS 规则集扩展,适用于 Automattic 的 WordPress 托管服务,包括 WPCS。一个 Makefile 协调这些测试的执行。每个测试的结果都会通过格式为 phpcs-{version}.txt 的文件来标记版本。

运行所有生产级测试(PHP 8.0、8.1 和 8.2)

make test

运行特定语言版本的测试

make {version}

其中 {version} 是 php80、php81 或 php82

PHPUnit

PHPUnit 被实现用于运行跨一些当前和未来组件的测试套件。一个 Makefile 协调这些测试的执行。每个测试的结果都会通过格式为 phpunit-{version}.txt 的文件来标记版本。

运行所有生产级测试(PHP 8.0、8.1 和 8.2)

make unit

运行特定语言版本的测试

make {version}

其中 {version} 是 unitphp80、unitphp81 或 unitphp82

质量说明

两个测试套件都可以使用 shell 命令 make 来运行。

不使用 Make 进行测试

如果您在没有 Make 的情况下进行测试,可以使用安装了目标版本 PHP 的 Composer 直接运行测试。

Composer PHPCS/PHPCBF

composer -n phpcs -- --standard="{STANDARDS_FILE}" ./
composer -n phpcbf -- --standard="{STANDARDS_FILE}" ./

此操作使用 CLI(本说明范围外)使用的 PHP 版本。

将项目根目录中的适当文件名替换为 {STANDARDS_FILE},例如,对于 PHP 8.2 使用 --standard="./.phpcs-8.2.xml.dist"

Composer PHPUnit

composer -n phpunit

此操作使用 CLI(本说明范围外)使用的 PHP 版本。

如何使用

WordPress:使用基础帖子类型实体模型

Kanopi\Components\Model\Data\WordPress\BasePostType 抽象类是许多常见 WordPress 导入情况的整合辅助类。它不支持所有用例,但如果您的数据遵循以下要求则很有用

  • 使用一个或多个标量/简单元字段
  • 使用一个或多个 非分层 分类法
  • 使用一个跨系统标识符,可以从任何来源/目标存储库构建/检索以匹配数据以进行更新

实现可以遵循以下模式,例如帖子类型的位置 location。模型具有以下字段

模型可以按照以下标准实现

  • 将字符串类型的标量类型添加到您的类中,用于 addresscity
  • 扩展该类并实现 extraInsertFieldMappingmetaFieldMappingtaxonomyTermMapping,将元字段和分类字段名称映射到实体属性。例如,具有地址和城市/地区的位置
    class Location extends BasePostType implements IIndexedEntity {
        /**
         * @var string
         */
        public string $address = '';
    
        /**
         * @var string
         */
        public string $city = '';
    
        /**
         * @var string
         */
        public string $id = '';
    
        /**
         * @var string
         */
        public string $modifiedDate = '';
    
        /**
         * {@inheritDoc}
         */
        function entityName(): string {
            return 'location';
        }
        
        /**
         * {@inheritDoc}
         */
        function uniqueIdentifier(): string {
            return $this->id;
        }
    
        /**
         * {@inheritDoc}
         */
        function version(): string {
            return $this->modifiedDate;
        }
    
        /**
         * {@inheritDoc}
         */
         function extraInsertFieldMapping(): array {
            return [];
         }
        
         /**
          * {@inheritDoc}
          */
         function metaFieldMapping(): array {
            return [
                'address' => $this->address,
                'id' => $this->id,
                'modifiedDate' => $this->modifiedDate,
            ];
         }
    
         /**
          * {@inheritDoc}
          */
         function taxonomyTermMapping(): array {
            return [
                'city' => $this->city,
            ];
         }
    }
  • 现在,当使用类似 BasePostTypeWriter 的服务时,内置的 systemTransform 实现将返回适当的格式,用于 wp_insert_post