2014-01-10 2 views
2

Я построил простой API в symfony2 с доктриной 2 (с небольшой помощью отсюда: http://williamdurand.fr/2012/08/02/rest-apis-with-symfony2-the-right-way/). Все работает нормально. GET (все/одно), PUT, POST или DELETE, но я могу либо получить все ресурсы, либо только один с определенным идентификатором.Symfony2-Bundle для динамического DQL в RESTful-API

Но я хочу что-то вроде этого: GET /api/stuff?filter={ [ { "field": "fieldname", "operator": "eq", "value": "foo" }, { ... } ] }

, а затем вызвать getByFilter($filter) построить родовое DQL. У меня есть довольно ясная идея, как это сделать (я сделал что-то подобное, без symfony), но я не хочу изобретать велосипед.

Есть ли какие-либо комплекты или лучшие практики?

ответ

2

Насколько я знаю, нет единого пакета, предоставляющего общую функцию фильтрации. То, что вы здесь описываете, выглядит немного как OData filter system queries, и я никогда не нашел пакет, реализующий такую ​​спецификацию.

Однако FOSRestBundle предоставляет ParamFetcher feature, что позволяет вам настраивать параметры запроса, которые вы можете ожидать, а также значения по умолчанию и основные ограничения проверки. Это необходимо учитывать при разработке «фильтрующей части» API.

1

Возможно, я опаздываю, но хочу добавить, что есть библиотека AdrotecWebApiBundle для библиотеки breeze.server.php, которая является аналогом сервера библиотеки Breeze.js. Среди других функций breeze предоставляет мощные возможности запросов данных:

Запрос на языке запросов JavaScript с фильтрами, заказом и поисковым вызовом. Запросы Breeze реализуют стандарт запросов Open Data Protocol (OData), поэтому вы можете «развернуть» результат с соответствующими объектами или «проектом» над данными, чтобы чередовать столбцы выбора и сгладить графы объектов. Web API, OData и многие другие поставщики услуг могут реализовать спецификацию запроса OData.

Так что если вы решите пойти с запросами OData, это может стоить посмотреть.

0

Im оценивает ту же проблему. В настоящее время я считаю несколько вариантов:

пример реализации показан ниже:

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

  • самых полное решение: Если вы хотите реализовать t полный API, совместимый с odata, теперь доступны официальные библиотеки провайдеров odata, созданные для PHP (посмотрите на IDataServiceQueryProvider). https://github.com/MSOpenTech/odataphpprod К настоящему моменту нужны хорошие примеры реализаций, использующих эти библиотеки.

 Смежные вопросы

  • Нет связанных вопросов^_^