tatter/handlers

处理器发现与管理,适用于CodeIgniter 4

v3.0.0 2022-07-10 13:04 UTC

README

处理器发现与管理,适用于CodeIgniter 4

Coverage Status

快速开始

  1. 使用Composer安装:> composer require tatter/handlers
  2. 创建一个工厂来识别您的处理器
  3. 从任何命名空间发现类:$widgets = WidgetFactory::findAll();

功能

处理器 允许开发者在所有命名空间中定义和发现预定类型的类;它基本上是一个无数据库的“模型”。

安装

通过Composer轻松安装,利用CodeIgniter 4的自动加载功能,并始终保持最新状态

composer require tatter/handlers

或者,通过下载源文件并将其添加到 app/Config/Autoload.php 中来手动安装。

配置(可选)

可以通过扩展其配置文件来更改库的默认行为。将 examples/Handlers.php 复制到 app/Config/,并按照注释中的说明进行操作。如果 app/Config 中没有找到配置文件,则库将使用自己的配置。

用法

处理器 使用相对路径来发现包含处理器类的文件。在您的项目或模块中创建一个新文件夹,例如 app/Widgets/src/Reports

兼容性

为了使您的类能够被发现为处理器,您的类需要有一致的类型(类或接口)并通过类常量 HANDLER_ID 提供唯一的ID。

处理器 将通过此处理器ID解析类扩展,因此如果您想使应用程序“替换”另一个命名空间中的处理器,则只需扩展原始类并保留 HANDLER_ID 常量即可。

工厂

创建处理器类后,您需要一个工厂,该工厂提供查找路径和预期的类或接口来识别处理器。创建一个扩展 BaseFactory 的新类

<?php

namespace App\Factories;

use App\Interfaces\WidgetInterface;
use Tatter\Handlers\BaseFactory;

class WidgetFactory extends BaseFactory
{
    public const HANDLER_PATH = 'Widgets';
    public const HANDLER_TYPE = WidgetInterface::class;
}

然后,您可以使用 BaseFactory 方法定位所有处理器类或通过其ID定位特定处理器

use App\Factories\WidgetFactory;

// Iterate through all discovered handlers
foreach (WidgetFactory::findAll() as $class)
{
    $widget = new $class($param1, $param2);
    $widget->display();
}

// ... or get a single handler by specifying its ID
$class = WidgetFactory::find('FancyHandler');
(new $class)->display();

缓存

处理器 会扫描所有命名空间来发现相关的类。这种分布式文件系统读取在大项目中可能会很昂贵,因此 处理器 将根据配置文件中设置的持续时间(默认:一天)缓存结果。您可以通过将 $cacheDuration 设置为 null 来禁用缓存。

通常预先缓存处理器是一个好主意,这样就不会在页面实际加载时进行文件系统搜索。此库包括 FactoryFactory,一个“发现其他工厂的工厂”。如果您希望您的工厂类可以被 FactoryFactory 发现,并且其处理器可以自动缓存,则将您的工厂类放在 Factories 子文件夹中,并像任何其他处理器一样提供 HANDLER_ID 常量。

命令

为了帮助 FactoryFactory 发现您的工厂及其处理器,此库包括两个命令,可以预先缓存所有处理器类并清除缓存值

# Discovers and caches all compatible factories and their handlers
php spark handlers:cache

# Clears all cached factories and handlers
php spark handlers:clear

设置cron作业,每隔小于配置 $cacheDuration 的时间间隔运行 spark handlers:cache,以确保您的处理器始终可用。

示例

这里有一些其他库,它们实现了自己的Factory类和一组处理器。浏览它们的代码,了解您如何在自己的项目中使用 处理器