shadoll / lime
lime
Requires
- php: >=7.4
- ext-json: *
- shadoll/anemone: ^4.1
- shadoll/crocus: ^1.0
- shadoll/lantana: ^3.1
- shadoll/riccia: ^1.0
Requires (Dev)
- phpstan/phpstan: ^0.12
- phpstan/phpstan-phpunit: ^0.12
- phpstan/phpstan-strict-rules: ^0.12
- phpunit/phpunit: ^8
- sebastian/phpcpd: ^4.1
README
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\BeAction
、Lime\Contracts\BeCondition
继承)
所有方法名称都表明了其功能(以下是一些)
statically
- 对特定 Condact 的额外设置(针对前端)(条件和动作的处理方式不同)deep
- 对 Condact 的额外设置(请参阅示例)inner
- 对 Condact 的额外设置,用于触发某些操作的字段(请参阅示例)(一个重要特性 - 有动态继承)operator
- 用于额外筛选的运算符replace
- 对对象属性工作的额外数据
forDynamically
- 方法dynamically
的额外键(上面已描述)
Lime\Contracts\BeAction
,Lime\Contracts\BeCondition
动作和条件接口。
每个Condact都应该实现以下接口之一
方法
handle
- 直接处理Condact上下文- 属性
$inner
- 从具体规则元素中获取的配置数据 - 数组
$deep
- 所有级别元素的内嵌深度,直至父元素,父元素总是0
,即索引为0的迭代
- 属性
服务
服务必须实现接口 Lime\Contracts\BeService
主要(当前)服务包括 Lime\Services\ModulesService
和 Lime\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\BeModuleService
的 MODULES_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 的静态数据或模块(在 deep
、inner
等部分)中经常遇到 extends
参数。
模式特性
- | - 用于从不同键获取数据的分隔符:
'extends' => 'deep|pull',
- . - 用于过滤器的分隔符,点之后可以是过滤器的值或键值对:
'extends' => 'rules.event:App\\Events\\InnerRuleEvent',
- : - 过滤器值的分隔符(上方所述)
(目前功能尚未完全实现)
===
待续...