shadoll/lime

此包已弃用且不再维护。未建议替代包。

lime

v2.1.6 2020-06-15 21:06 UTC

README

Latest Stable Version pipeline status coverage report License

Lime 库

安装

composer require shadoll/lime

服务器 lime 的逻辑部分(用于场景)

用途:用于将应用程序的工作逻辑与辅助操作分离。

扩展建立在模块化(组件化)结构之上,使用了来自不同组 创建者结构行为 创建者结构 的不同模式,为基础服务和模块的工作提供基础(单例、原型、适配器、装饰器)行为 - 在场景工作(链式、迭代器、中介者、状态、...)

单词 Condact - 在此项目中引入,用于表示中间的简单概念,即条件/动作。即 Condact 是条件或动作(未来可能会有所增加)

模块

模块代表一个动态概念 - 它们的意义、数量以及每个模块的工作原理都没有必要详细描述。这一陈述也适用于条件和动作...

只需描述各个实体必须实现的接口即可。

每个新模块都必须实现接口 Lime\Contracts\BeModule,并且通常继承自基本模块类 Lime\Modules\BaseModule(其中包含所有模块的通用操作),除非模块具有非标准行为,否则可以省略此类

在所有继承自基本抽象模块的模块中,都可以将所有条件和动作注册到静态属性 $REGISTERED 中(否则您必须自己负责注册事件)

Lime\Contracts\BeModule

接口 Lime\Contracts\BeModule 中的所有抽象方法名称都表明了其功能,下面简要说明一些

  • getClient - 可以返回模块的客户
  • dynamically - 应该返回特定 Condact 的动态数据数组(通常返回空数组)。同时,Condact 还实现了 forDynamically 方法以提供额外键(开发者决定方法内部的逻辑)
  • fullDynamically - 模块的所有属性(dynamically 方法是此大方法的特殊情况)(但最终决定权在开发者手中)
  • getValueFor - 此方法应能提供其数据(当然,它没有自己的数据,但必须知道如何从存储中获取数据,考虑到所有嵌套级别等)该方法对每个模块的实现都相当复杂
  • getConverting - 获取模块的接口对象 Lime\Contracts\BeConverting
  • init - 模块初始化(数据准备、系统中的初步初始化等)

Lime\Contracts\BeCondact

通用服务接口(由 Lime\Contracts\BeActionLime\Contracts\BeCondition 继承)

所有方法名称都表明了其功能(以下是一些)

  • statically - 对特定 Condact 的额外设置(针对前端)(条件和动作的处理方式不同)
    • deep - 对 Condact 的额外设置(请参阅示例)
    • inner - 对 Condact 的额外设置,用于触发某些操作的字段(请参阅示例)(一个重要特性 - 有动态继承)
    • operator - 用于额外筛选的运算符
    • replace - 对对象属性工作的额外数据
  • forDynamically - 方法 dynamically 的额外键(上面已描述)

Lime\Contracts\BeActionLime\Contracts\BeCondition

动作和条件接口。

每个Condact都应该实现以下接口之一

方法

  • handle - 直接处理Condact上下文
    • 属性 $inner - 从具体规则元素中获取的配置数据
    • 数组 $deep - 所有级别元素的内嵌深度,直至父元素,父元素总是 0,即索引为0的迭代

服务

服务必须实现接口 Lime\Contracts\BeService

主要(当前)服务包括 Lime\Services\ModulesServiceLime\Services\DataStateService

如果模块不足以工作,可以创建自己的服务(例如,Lime\Modules\Anemone\AnemoneService),以进行更复杂的模块操作。需要时可以初始化接口服务 Lime\Contracts\BeAgent(例如,在无法序列化对象时等,例如在同一个 Lime\Modules\Anemone\AnemoneService 中)

Lime\Services\ModulesService

此服务旨在控制和管理单个客户下的所有系统模块(该服务主要用于lime服务器中的服务目的(获取客户范围内所有已知模块的静态和动态数据))

初始化需要模型 Lantana\Models\JSSharedCustomers,如果不能将其作为构造函数参数传递,则必须在使用服务之前将其传递给 init 方法

方法

  • isReady - 返回服务准备工作的状态
  • getCustomer - 当前客户 Lantana\Models\JSSharedCustomers
  • getModules - 客户端注册的模块列表
  • getModule - 通过 uuid 或模块的 getID 方法值获取模块
  • getEntities - 获取模块的原始实体集合(主要用于应用程序的前端序列化)
  • statically - 注册的静态模块列表
  • getAvailableModules - 注册的模块类列表

所有新模块都必须在接口常量 Lime\Contracts\BeModuleServiceMODULES_AVAILABLE 中注册

Lime\Services\DataStateService

该服务旨在在脚本运行期间处理数据。也就是说,其状态根据Condact的执行结果而不断变化。

服务数据在两个平面上发生变化:垂直(按级别)和水平(按Condact的流程点)

垂直数据从上(较高的级别)到下(根级别)可见。垂直数据在程序指针向下离开级别后将被销毁(因为向上离开指针将通过该级别返回,因此存在这样的数据可见性)维基上有相关插图

此外,在每级上还可以通过名称获取额外的隔离 数据池。这些数据也遵循相同的可见性规则,但它们的特点是数据可以在指针从级别向下退出之前被销毁。因此,在一个级别上销毁数据池后,可以创建新的数据池,依此类推。

在静态属性 $MODULES_DATA 中注册所有静态模块的可能集合和注入器(主要用于设置脚本)

此服务的所有方法名称都有其含义

注入器

这是额外的辅助对象,可以注入用于启动脚本的基本数据。 (可能有注入器是不必要的) 注入器的例子是 Lime\Modules\Anemone\Inject\HookDecorator,它具有钩子数据。

注入器必须实现接口 Lime\Contracts\BeInject(两个方法,用于初始化和销毁注入器)

转换器

需要更复杂的数据(数据结构)处理(无法在模块本身中实现或效率不高),在模块的方法 getConverting 中提到了这一点。

2020-06-04 添加了转换器执行器(实际上进行了重构,每个类型转换器的逻辑被移动到单独的类中。实际上,接口 Lime\Contracts\BeConverting 的对象成为代理类)

转换器必须实现接口 Lime\Contracts\BeConverting

  • getValue - 获取转换器的"计算"值
  • getPreparingData - 准备数据(这里需要稍加理解,因为这个方法并不是所有情况下都明确)
  • getConvert - 获取接口对象 Lime\Contracts\BeExecuteConvert(执行转换器)

转换器应该隐式属于其中一个模块。

执行转换器

为了简化转换器 - 一个执行转换器的类应该执行一个简单的转换操作。每个执行转换器都应该实现接口 Lime\Contracts\BeExecuteConvert(如果方法不足,可以使用构造函数)

在 Condact 的静态数据或模块(在 deepinner 等部分)中经常遇到 extends 参数。

模式特性

  • | - 用于从不同键获取数据的分隔符:'extends' => 'deep|pull',
  • . - 用于过滤器的分隔符,点之后可以是过滤器的值或键值对:'extends' => 'rules.event:App\\Events\\InnerRuleEvent',
  • : - 过滤器值的分隔符(上方所述)

(目前功能尚未完全实现)

===

待续...