我用原则2在symfony2中构建了一个简单的API(这里有一点帮助:http://williamdurand.fr/2012/08/02/rest-apis-with-symfony2-the-right-way/)。一切都很好。GET(All/One)、PUT、POST或DELETE都可以,但我既可以获取所有资源,也可以只获取一个具有特定Id的资源
但我想要这样的东西:GET /api/stuff?filter={
[
{
"field": "fieldname",
"operator": "eq",
"value": "foo"
},
{
...
}
]
}
然后调用CCD_ 2来构建通用DQL。我很清楚该怎么做(我做了类似的事情,没有symfony),但我不想重新发明轮子。
有什么捆绑包或最佳实践吗?
据我所知,没有提供通用过滤功能的捆绑包。您在这里描述的内容看起来有点像OData过滤系统查询,而且我从未找到实现这种规范的捆绑包
但是,FOSRestBundle提供了ParamFetcher功能,允许您配置您可能期望的查询参数、默认值和基本验证约束。在开发API的"过滤部分"时需要考虑这一点。
我可能迟到了,但我想补充一点,breez.server.php库有AdrotecWebApiBundle,它是breeze.js库的服务器对应程序。在其他功能中,微风提供了强大的数据查询功能:
使用JavaScript查询语言进行查询,包括过滤器、排序和分页。Breeze查询实现了开放数据协议(OData)查询标准,因此您可以使用相关实体或数据上的"项目"来"扩展"结果,以筛选列并展平对象图。Web API、OData和许多其他服务提供商可以实现OData查询规范
因此,如果决定使用OData查询,可能值得一看。
我正在评估同一个问题。目前,我考虑了几个选项:
- 快速且"几乎完全"的解决方案:检查这个symfony rest bundle,它实现了一个用于解析odata类参数的库。非常优雅的实现,但不使用官方的odata库。https://github.com/Eyjafjallajokull/symfony-rest-bundle详细的解析器类在这里(使用JMS继承):https://github.com/Eyjafjallajokull/symfony-rest-bundle/blob/master/QueryParams/FilterParser.php
下面显示了一个实现示例:
public function getFilters() {
$filters = $this->query->get('filter', '');
if (!empty($filters)) {
try {
$fp = new FilterParser();
$filters = $fp->parse($filters);
} catch (SyntaxErrorException $e) {
throw new BadRequestException('Invalid filter definition. '.$e->getMessage(), null, $e);
}
} else {
return null;
}
return $filters;
}
用法提取自https://github.com/Eyjafjallajokull/symfony-rest-bundle/blob/master/QueryParams/QueryParams.php
- 最完整的解决方案:如果您想实现完全符合odata的API,现在可以使用为PHP构建的官方odata提供程序库(请参阅IDataServiceQueryProvider)。https://github.com/MSOpenTech/odataphpprod到目前为止,还需要使用这些库实现的好例子