khalyomede / odata-query-parser
解析 OData v4 查询字符串。
v0.1.0
2019-12-05 23:01 UTC
Requires
- php: >=7.2.0
- league/uri-query-parser: 1.*
Requires (Dev)
- infection/infection: 0.*
- phpunit/phpunit: 8.*
This package is auto-updated.
Last update: 2024-09-07 12:45:12 UTC
README
请注意,我不再能定期提供更新。请查看此仓库以获取更更新的版本:https://github.com/Globy-App/odata-query-parser。
odata-query-parser
解析 OData v4 查询字符串。
摘要
关于
我需要仅解析查询字符串,以将 OData v4 命令转换为可理解的数组,这样我就可以使用它来创建一个 Laravel 扩展包,以自动使用 Eloquent 按照解析后的 OData v4 命令数组进行过滤。
因为我没有看到专门处理解析查询字符串的包,并且看到一些人自己工作并开源了,我决定自己开始一个。
功能
- 解析 URL 并返回一个数组
- 支持
$select
、$top
、$skip
、$orderby
、$count
- 部分支持
$filter
(见 已知问题 部分) - 你可以使用一个解析模式,让你在不添加
$
符号的情况下解析这些关键字
要求
- PHP >= 7.2.0
- Composer
安装
将包添加到依赖中
composer require khalyomede/odata-query-parser
示例
1. 使用 $select 过滤某些字段
在这个例子中,我们将使用 $select
OData 查询字符串命令来过滤 API 返回的字段。
use Khalyomede\OdataQueryParser; $data = OdataQueryParser::parse('http://example.com/api/user?$select=id,name,age');
如果你检查 $data
,你会得到以下内容
[ "select" => [ "id", "name", "age" ] ]
2. 使用非美元语法
在这个例子中,我们将使用这个库的独特功能:在不指定任何美元符号的情况下,仍然能够使用 OData v4 URL 查询参数语法。
use Khalyomede/OdataQueryParser; $data = OdataQueryParser::parse("http://example.com/api/user?select=id,name,age", $withDollar = false);
如果你检查 $data
,你会得到以下内容
[ "select" => [ "id", "name", "age" ] ]
API
OdataQueryParser::parse(string $url, bool $withDollar = true): array;
参数
- string
$url
: 从中解析查询字符串的 URL。它应该是一个 "完整" 或 "完整" 的 URL,这意味着http://example.com
将通过,而example.com
将不会通过 - bool
$withDollar
: 如果你想解析查询字符串而不需要在每个键前添加$
符号,则将其设置为 false
返回
关联数组
return = [ string? "select" => array<string>, string? "count" => bool, string? "top" => int, string? "skip" => int, string? "orderBy" => array<OrderBy>, string? "filter" => array<Filter> ]; OrderBy = [ string "property" => string, string "direction" => Direction ] Direction = "asc" | "desc" Filter = [ string "left" => string, string "operator" => string, string "right" => mixed ]
抛出
InvalidArgumentException
- 如果参数
$url
不是一个有效的 URL(请参阅参数描述以了解什么是有效的 URL) - 如果
$top
查询字符串值不是一个整数 - 如果
$top
查询字符串值小于 0 - 如果
$skip
查询字符串值不是一个整数 - 如果
$skip
查询字符串值小于 0 - 如果
$orderby
查询字符串值的方向既不是asc
也不是desc
- 如果参数
已知问题
$filter
命令不会解析or
和函数(如contains()
或substringof
),因为我目前没有专注于这个($filter
的解析器过于简单,我应该找到一种方法来创建一个 AST)。