我正在开发一个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中挂钩反序列化过程?如果我可以在转换器处理数据之前过滤/清除请求(简单搜索/替换错误的日期格式),问题可以在几分钟内解决。
有任何想法/建议怎么做?
谢谢!
答案 0 :(得分:1)
为什么不create your own ParamConverter扩展/使用现有的内容(例如,在内置的DateTime ParamConverter中,请参阅documentation)
您甚至可以为ParamConverters设置优先级,以确保在另一个之前执行。
或者你有什么特别想要在这里实现的目标吗?
答案 1 :(得分:1)
您可以为事件反序列化事件
创建事件侦听器在反序列化对象之前调度它。你可以用它 修改提交的数据,或修改正在使用的类型 反序列化。
此外,您可以为 kernel.request (或 kernel.controller 优先级大于param converter listener priotity)事件创建侦听器,并过滤根据需要提供数据。