fattureincloud/api-filter

一个用于类似 SQL 过滤器的 PHP 解析器

v2.0.0 2024-09-02 07:40 UTC

This package is auto-updated.

Last update: 2024-09-02 07:41:24 UTC


README

这个 PHP 库使得解析字符串参数并将其用于初始化一个可以用于 REST API 的 Filter 成为可能;输入字符串基于简化的 SQL 类似 WHERE 子句,使其易于理解和使用。

该库返回基于类的过滤器表示,可用于生成实际应用于 API 请求的过滤器。

免责声明

该库目前专注于解析和构建查询的表示,它本身并不验证查询。例如,它不会检查字段是否存在或是否支持您的过滤器,也不会对查询执行权限检查。您应该自己注意这一点。

即使此过滤器使用了一种应该减少 SQL 注入风险的语法,您也应该采用某种策略来验证过滤器并避免执行不安全的查询。

安装

通过 Composer

$ composer require fattureincloud/api-filter

用法

要解析过滤器字符串,您可以使用 FattureInCloud\ApiFilter\FilterFactory

use FattureInCloud\ApiFilter\FilterFactory

$str = "id = 5";
$factory = new FilterFactory();

$filter = $factory->initFilter($str);

返回的过滤器将是由 FattureInCloud\ApiFilter\Filter 包中包含的类组成的组合。

字符串基于三元组

field op value

字段 是一个包含点和下划线的小写字符串。

操作符 是以下之一(无需引号)

  • 等于: '='
  • 大于: '>'
  • 大于等于: '>='
  • 小于: '<'
  • 小于等于: '<='
  • 不等于: '<>', '!='

可以是以下之一

  • 字符串: 'value'
  • 布尔值: true, false
  • 整数: 46
  • 双精度浮点数: 12.34

您可以通过将单引号加倍来在字符串值中 转义单引号。过滤器将处理返回预期的字符串。

您还可以使用以下运算符之一来 匹配字符串与模式

  • 类似: 'like', 'LIKE'
  • 包含: 'contains', 'CONTAINS'
  • 以...开始: 'starts with', 'STARTS WITH'
  • 以...结束: 'ends with', 'ENDS WITH'

类似和包含也可以取反

  • 不类似: 'not like', 'NOT LIKE'
  • 不包含: 'not contains', 'NOT CONTAINS'

此外,您还可以使用 NULL 检查字段是否有值或没有值

  • 空字段: 'IS NULL', 'is null', '= null', '= NULL'
  • 非空字段: 'IS NOT NULL', 'is not null', '<> null', '!= null', '<> NULL', '!= NULL'

您可以使用以下运算符

  • 合取: 'and', 'AND'
  • 析取: 'or', 'OR'

括号可用于组合复杂表达式。

例如

city = 'Bergamo' and (age < 30 or (dev = true and (name = 'Giorgio' and surname is not null) or employer starts with 'Fatture'))

测试

$ composer test

解析器生成

解析器是使用 ANTLRPHP 目标 自动生成的;它位于 FattureInCloud\ApiFilter\Parser 仓库中。通常,您不应直接管理解析器:FilterFactory 类是一个包装器,它为您管理它。

语法位于 /grammar 文件夹下,如果需要,您可以使用 docker 和 composer 触发解析器生成。

$ composer generate

如有需要,您可以通过更改 entrypoint.sh 文件中的 ANTLR 目标 在另一种语言中生成解析器。

许可证

MIT 许可证 (MIT)。