tklein / php-combine-conditions
PHP 条件结构/树库的通用表示。
Requires
- php: ^8.1
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.4
- pdepend/pdepend: ^2.1
- phpmd/phpmd: ^2.11
- phpstan/phpstan: ^1.3
- phpunit/phpunit: ^9.5
- sebastian/phpcpd: ^6.0
- squizlabs/php_codesniffer: ^3.6
This package is auto-updated.
Last update: 2024-09-02 20:06:11 UTC
README
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
接口。 - 将您的操作符(两种类型:
logical
和comparator
)添加到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...然后重置)
-> 具有不可变实现的可能性(不要破坏它!)
添加测试和示例:从头开始,带有和没有新运算符,以及执行(带有预期结果)。
作者
- Thomas Klein - 初始工作 - 这就是我!
另请参阅参与此项目的贡献者列表。
许可证
本项目采用MIT许可证 - 请参阅LICENSE文件以获取详细信息。