2016-03-07 3 views
0

Я работаю над Symfony 2 WebApp, который предоставляет веб-сервис JSON для связи с мобильными приложениями на разных платформах (iOS, Android и т. Д.).Symfony2 + FOS RestBundle: фильтровать/очищать запрос JSON перед применением ParamConverter

WebApp использует FOS RestBundle для обработки и десериализаций полученных данных в формате JSON:

# app/config/config.yml 
sensio_framework_extra: 
    request: { converters: true } 

fos_rest: 
    ... 
    body_converter: 
     enabled: true 


/** 
* Sync Controller implementation 
* @ParamConverter("post", converter="fos_rest.request_body") 
*/ 
public function syncAction(SyncBag $syncBag) { 
    // ... 
} 


/** 
* Sync Data Wrapper 
*/ 
public class SyncBag { 
    ... 
    /** 
    * @JMS\Type("DateTime<'Y-m-d'>") 
    */ 
    private $startDate; 
} 

Это работает очень хорошо. Проблема: Некоторые из мобильных приложений используют неправильный формат даты для отправки некоторых данных. Хотя WebApp ожидает «Y-m-d», мобильные приложения отправляют «Y-m-d H: i: s». Это приводит к исключению:

Uncaught РНР Исключение Symfony \ Component \ HttpKernel \ Исключение \ BadRequestHttpException: "Недопустимый DateTime "2016-03-04 12:00:00", ожидаемый формат Y-м-д." в /.../vendor/friendsofsymfony/rest-bundle/FOS/RestBundle/Request/AbstractRequestBodyParamConverter.php линии 113

Конечно обновления мобильных приложений для использования/отправки правильный формат даты является правильным решение этой ошибки. Но реализация и публикация этого исправления займет довольно много времени. Прохождение обзора яблок займет некоторое время. Ожидание обновления пользователями последней версии займет некоторое время. И так далее.

С другой стороны, проблему можно было бы легко решить, обновив процесс десериализации в WebApp.

Вопрос: ли это как-то можно подключить к процессу десериализации внутри FOS RestBundle ParamConverter? Если бы я мог фильтровать/очищать запрос (простой поиск/замену неправильных форматов дат), прежде чем данные будут обрабатываться конвертером, проблема может быть решена в течение нескольких минут.

Любая идея/предложение, как это сделать?

Спасибо!

ответ

1

Почему не create your own ParamConverter расширения/используя то, что вам нужно от существующих (например, в вашем случае от встроенного в DateTime ParamConverter см documentation)

Вы даже можете установить приоритет для ParamConverters, чтобы быть уверенным, один выполнен перед другим.

Или есть что-нибудь особенное, чего вы хотели бы достичь здесь?

1

Вы можете создать прослушиватель события для предварительного события десериализации

Example for JMSSerializer

Это передается перед объектом десериализируется. Вы можете использовать этот для изменения представленных данных или изменения типа, используемого для десериализации .

Кроме того, вы можете создать для слушателя kernel.request (или для kernel.controller с приоритетом больше, чем пары преобразовательного слушателя priotity) событиями и фильтровать данные, как необходимость.

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