用于RESTful-API中的动态DQL的Symfony2-绑定



我用原则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到目前为止,还需要使用这些库实现的好例子

最新更新