Symfony2 + FOS RestBundle:在应用ParamConverter之前过滤/清除JSON请求

时间:2016-03-07 12:51:49

标签: php json symfony

我正在开发一个Symfony 2 WebApp,它提供了一个JSON Web服务,可以与不同平台(iOS,Android等)上的移动应用进行通信。

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期望&#34; Y-m-d&#34;移动应用程序发送&#34; Y-m-d H:i:s&#34;。这导致了一个例外:

  

未捕获的PHP异常   Symfony的\分量\ HttpKernel \异常\ BadRequestHttpException:   &#34;无效的日期时间&#34; 2016-03-04 12:00:00&#34;,预期的格式Y-m-d。&#34;在   /.../vendor/friendsofsymfony/rest-bundle/FOS/RestBundle/Request/AbstractRequestBodyParamConverter.php   第113行

当然,更新移动应用程序以使用/发送正确的日期格式是此错误的正确解决方案。但实现和发布此错误修复程序需要相当长的时间。通过苹果审查将需要一些时间。等待用户更新最新版本需要一些时间。等等。

另一方面,通过更新WebApp中的反序列化过程可以很容易地解决问题。

问题: 是否有可能在FOS RestBundle ParamConverter中挂钩反序列化过程?如果我可以在转换器处理数据之前过滤/清除请求(简单搜索/替换错误的日期格式),问题可以在几分钟内解决。

有任何想法/建议怎么做?

谢谢!

2 个答案:

答案 0 :(得分:1)

为什么不create your own ParamConverter扩展/使用现有的内容(例如,在内置的DateTime ParamConverter中,请参阅documentation

您甚至可以为ParamConverters设置优先级,以确保在另一个之前执行。

或者你有什么特别想要在这里实现的目标吗?

答案 1 :(得分:1)

您可以为事件反序列化事件

创建事件侦听器

Example for JMSSerializer

  

在反序列化对象之前调度它。你可以用它   修改提交的数据,或修改正在使用的类型   反序列化。

此外,您可以为 kernel.request (或 kernel.controller 优先级大于param converter listener priotity)事件创建侦听器,并过滤根据需要提供数据。