khalyomede/odata-query-parser

解析 OData v4 查询字符串。

v0.1.0 2019-12-05 23:01 UTC

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 查询字符串。

Packagist Version Packagist PHP from Packagist Build Status Maintainability Known Vulnerabilities

摘要

关于

我需要仅解析查询字符串,以将 OData v4 命令转换为可理解的数组,这样我就可以使用它来创建一个 Laravel 扩展包,以自动使用 Eloquent 按照解析后的 OData v4 命令数组进行过滤。

因为我没有看到专门处理解析查询字符串的包,并且看到一些人自己工作并开源了,我决定自己开始一个。

功能

  • 解析 URL 并返回一个数组
  • 支持 $select$top$skip$orderby$count
  • 部分支持 $filter(见 已知问题 部分)
  • 你可以使用一个解析模式,让你在不添加 $ 符号的情况下解析这些关键字

要求

安装

将包添加到依赖中

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)。