tklein/php-combine-conditions

PHP 条件结构/树库的通用表示。

0.2.0 2022-01-15 15:38 UTC

This package is auto-updated.

Last update: 2024-09-02 20:06:11 UTC


README

Codacy Badge Scrutinizer Code Quality Code Climate Latest Stable Version PHP from Packagist License: MIT

PHP 条件结构/树库的通用表示。

安装

Composer(推荐)

此包通过Composer/Packagist提供

composer require tklein/php-combine-conditions

入门

PHP的组合条件库是一个工具,可以帮助您构建动态结构化的(如树或图)条件。
这些条件可以组合,并且可以提供自定义的操作符。
此库可以在许多上下文中使用,以执行高级条件的组合,生成一些复杂的SQL条件,或导出到多种格式,如JSON、XML、全文等。
使用此库的另一个案例是执行和处理前端条件树(例如:用户构建他的条件树,并希望处理结果)。

编写此库是为了让您以正确的方式实现它。因此,如果您从公共API实现接口,您可以构建自己的组合条件结构,并通过公共API服务继续执行它。

此库按照PSR12编码标准编写。

主库入口

对于简单使用,您只需使用以下类:\LogicTree\LogicTreeFacade
此类允许您使用库的主要功能,如构建组合条件,执行某些操作,并将它们导出。

操作符池

什么是 OperatorPool?它是一个将库中使用的所有操作符实例组合在一起的类。
您可以从此类注册或检索 OperatorInterface。目的是在您的条件组合中使用它们。
操作符分为两大组

  • 比较操作符。
  • 逻辑操作符。

比较操作符

比较操作符用于确定布尔表达式的结果。
例如
“A”和“B”是否相同?我可以使用等价操作符测试:'A' == 'B')。

默认的比较操作符可在: src/Operator/Comparator 中找到。
它在 ConditionInterface 定义中使用,称为 Condition 对象。

逻辑操作符

逻辑操作符用于交换多个布尔表达式(至少两个)。
例如
'A' != 'B' 的结果应该与 'C' != 'D' 相同。
我可以使用以下表达式进行检查:'A' != 'B' AND 'C' != 'D'

默认的逻辑操作符可在: src/Operator/Logical 中找到。
它在 CombineInterface 定义中使用,称为 Combine 对象。

覆盖/添加新操作符

库允许您覆盖默认操作符并提供新的操作符。

  • 您应该实例化 OperatorPool 类。
  • 创建您的操作符。它们必须实现 OperatorInterface 接口。
  • 将您的操作符(两种类型: logicalcomparator)添加到 OperatorPool 对象中。
  • 最后,将 OperatorPool 对象传递给 ConditionManager 类的构造函数中。

例如:在以下示例中,我们使用我们的操作符覆盖默认的比较器,并添加一个新的操作符。

$operatorPool = new \LogicTree\Operator\OperatorPool();
  
$operatorPool->addOperator(
    \LogicTree\Operator\OperatorType::Logical,
    \LogicTree\Operator\Logical\LogicalOperatorConverter::CODE,
    new \My\Class\AndOperator()
);
$operatorPool->addOperator(
    \LogicTree\Operator\OperatorType::Comparator,
    \LogicTree\Operator\Comparator\EqOperator::CODE,
    new \My\Class\EqOperator()
);
$operatorPool->addOperator(
    \LogicTree\Operator\OperatorType::Comparator,
    'my_custom_operator',
    new \My\Class\MyCustomOperator()
);
  
$conditionManager = new \LogicTree\Service\ConditionManager($operatorPool);

现在我们可以在代码中使用这些运算符,并在库的任何地方使用它们。

条件和组合

这些类始终实现NodeInterface接口。它代表库的基本模型。
由于组合模式,你可能想知道当前对象是根节点还是节点,你应该使用以下方法

  • hasParent():检查当前对象是否有父对象。
  • getParent():获取当前对象的父对象。
  • ConditionInterface:是其实例,表示最后一个/最终节点。
  • CombineInterface:是其实例,表示容器节点。

条件

ConditionInterface:它表示带有比较运算符的表达式。
接口是:\LogicTree\Model\ConditionInterface
具体的默认类是:\LogicTree\Model\Condition
它需要一个混合值,通过运算符与数据源中的值进行比较。

运算符是一个string,它是所需运算符的代码。第一个值是一个string,它是DataSource对象中值的标识符。
要比较的值必须是一个mixed值。

组合

Combine:它表示带有逻辑运算符的表达式。
接口是:\LogicTree\Model\CombineInterface。具体的默认类是:\LogicTree\Model\Combine
它需要至少两个条件和/或组合,以与逻辑运算符进行交换。

运算符是一个string,它是所需运算符的代码。
条件和/或组合必须是ConditionInterface的实例。

你可以使用以下方法将NodeInterface添加到CombineInterface

  • addChild(NodeInterface $node):向父节点对象添加一个新的节点子对象。
  • setChildren(array $nodes):用新的子对象替换子对象。

如果你想反转条件和组合的结果,你可以指定给CombineInterface对象,结果实际上应该被反转

  • setIsInvert(bool $isInvert).

执行组合条件

为了执行组合条件,你必须使用\LogicTree\Service\ConditionManager类。
此服务允许对您的NodeInterface对象执行许多操作。
实际上,公共API中只提供了execute方法。
无论如何,execute方法允许你确定组合条件的最终结果。

导出组合条件到格式

尚未提供文档!

示例

代码使用案例的示例可在此文件中找到。

运行测试

测试放在库根目录下的tests目录中。

尚未提供测试!

贡献

欢迎提供帮助,请随意提出问题或发起拉取请求。更多详细信息请参阅CONTRIBUTING.md

待办事项列表

实现以下比较运算符

  - array("from" => $fromValue, "to" => $toValue)
  - array("like" => $likeValue)
  - array("moreq" => $moreOrEqualValue)
  - array("finset" => $valueInSet)
  - array("seq" => $stringValue)
  - array("sneq" => $stringValue)

ToString方法,以便以全文本/不同格式渲染组合条件。
必须实现:AdapterPool (toFormat) - ConverterPool (getSymbol, getExpression, getFullExpression)。
可以添加自定义类型节点并在服务中处理它们。
研究命名空间和库名称:趋势

待办事项:构建器(setter... getter...然后重置)
-> 具有不可变实现的可能性(不要破坏它!)

添加测试和示例:从头开始,带有和没有新运算符,以及执行(带有预期结果)。

作者

另请参阅参与此项目的贡献者列表。

许可证

本项目采用MIT许可证 - 请参阅LICENSE文件以获取详细信息。