bravepickle / query-filters-serializer
将数组或字符串中的查询过滤器序列化的库。为预配置的过滤器提供约束和解析逻辑
Requires
- php: >=5.5
- ext-mbstring: *
Requires (Dev)
- phpunit/phpunit: >4
This package is auto-updated.
Last update: 2024-09-24 16:18:10 UTC
README
将数组或字符串中的查询过滤器序列化的库。为预配置的过滤器提供约束和解析逻辑
描述
这是一个PHP库,提供了使用查询字符串进行抽象过滤器的序列化和反序列化,兼容URL格式。该库的主要目的是帮助开发者在URI中创建更或更少的标准化过滤器,并将其转换为整洁的结构以供进一步使用。此外,它还可以提供(可选)SQL构建器,帮助将过滤器附加到SQL查询中。它与SQL实现几乎无关,可以用于各种数据库:Doctrine、MySQL、SphinxQL等。
可以使用每个字段的配置轻松配置过滤器
内容
安装
添加到composer.json
-
将依赖项添加到composer.json
-
安装新依赖项
$ composer install
功能
- 目前支持以下过滤器:
- 整数
- 日期时间
- 日期
- 枚举
- 字符串
- 布尔值
- 嵌入
- 支持解析两种字符串查询格式
- 字符串:
type:cool|foo:bar;baz|num:>10;<25|startDate:2000-10-01 - URL查询:值关联数组或字符串 -
_[type]=cool&_[foo][]=bar&_[foo][]=baz&_[user][id]=1&_[user][name]=Paul
- 字符串:
- 可定制,易于配置
- 可以定义额外的过滤器
- 返回的解析过滤器可以是多级数组或对象集合(由配置定义)
- 可定制过滤器和解析设置
- 为开发者在集合中定义复杂的过滤记录逻辑提供性能提升,而不受限制
使用
目前只支持两种查询序列化格式:字符串和URL查询。您可以根据现有的示例实现自己的格式。要查看更多使用示例,请参阅提供的测试
- 字符串格式更适合API请求,使用单个参数传递所有过滤器,具有不太复杂的过滤实现
- URL查询格式可以适用于具有更复杂逻辑和嵌入类型的常规Web应用程序和API
字符串格式
这是一个自定义字符串格式,它实现了设置过滤器简单而有效的方法。它简短,易于阅读。以下是一个示例:
// ... use QueryFilterSerializer as App; $options = new App\Config\Options(); $options->constraints = array('age' => array('type' => 'integer')); $filterString = 'age:>=14;<18'; // string to parse $serializer = new QuerySerializer(); // default encoder is StringEncoder so we can skip its init $serializer->setOptions($options); $filters = $serializer->unserialize($filterString); var_export($filters); // Output: array ( 'age' => array ( 'constraints' => array ( array ( 'condition' => 'gte', 'value' => '14', ), array ( 'condition' => 'lt', 'value' => '18', ), ), 'type' => 'integer', 'field' => 'age', ), );
其主要缺点可能在于客户端的正确格式化以及转义所有用于它的特殊字符,在没有事先仔细思考的情况下,比URL查询格式更容易出错。好事是,它们是可定制的,您可以在需要时更改它们,或者确保它们不会出现在您的查询中。
其他示例
URL查询格式
此选项易于在客户端实现,基于常规的URL查询字符串格式。它可以由您的PHP应用程序或序列化器本身自动解析。可以直接在HTML表单中发送,并支持最复杂的数据过滤案例。
// ... use QueryFilterSerializer as App; $options = new App\Config\Options(); $options->constraints = array('age' => array('type' => 'integer')); $filterQuery = '_[age][]=>=14&_[age][]=<18'; // string to parse # $filterQuery = ["age" => [">=14", "<18"]]; // this is an alternative way to specify filters. Array used instead $encoder = new App\Encoder\UrlQueryEncoder(); $options->filterTypeEncoders[App\Filter\Type\EmbeddedType::NAME] = App\Encoder\Filter\ArrayEmbeddedTypeEncoder::class; // required if embedded types should be supported $serializer = new QuerySerializer($options, $encoder); $filters = $serializer->unserialize($filterQuery); var_export($filters); // Output: array ( 'age' => array ( 'constraints' => array ( array ( 'condition' => 'gte', 'value' => '14', ), array ( 'condition' => 'lt', 'value' => '18', ), ), 'type' => 'integer', 'field' => 'age', ), );
这是查询过滤的较长版本,不易于人类阅读。由于其客户端和服务器从开始就支持的坚固的URI组件格式规则,因此更适合嵌入和自定义过滤器类型。
如果您需要将其用作URI中的单个GET参数,可以使用以下格式:'http://example.com?filter=' + urlencode('_[foo]=bar&_[num]=>baz')。
其他示例
配置
待定
高级使用
待定
待办事项
- 编写测试
- 支持递归嵌入过滤器
- 添加JS序列化器
- 使用更多对象而不是数组。例如,序列化器选项,返回值
- 对于添加到序列化器的类型,使用注册方法或DI
- 尽可能使用接口而不是类进行定义
- 为过滤器类型添加加载器接口及其实现
- 更新文档
- 为UrlQueryEncoder实现嵌入类型
- 使用对象填充结果过滤数据
- 实现从数组到字符串的序列化
- 在README中添加配置部分,其中包含有关如何配置序列化器及其组件的信息
- 在README中添加高级使用部分,其中包含有关如何自定义序列化器、扩展过滤器类型、加载器、编码器等的信息
许可证
MIT