2016-03-07 29 views
0

我正在開發一個Symfony 2 WebApp,它提供了一個JSON webservice來與不同平臺(iOS,Android等)上的移動應用進行通信。Symfony2 + FOS RestBundle:在應用ParamConverter之前過濾/清除JSON請求

的Web應用程序使用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」。這導致一個例外:

捕獲的PHP異常 的Symfony \分量\ HttpKernel \異常\ BadRequestHttpException: 「無效的日期時間 」2016年3月4日12:00:00「,預期的格式Y-M-d」。在 /.../vendor/friendsofsymfony/rest-bundle/FOS/RestBundle/Request/AbstractRequestBodyParamConverter.php 線113

當然更新所述移動應用使用/發送正確的日期格式爲正確的解決這個錯誤。但是實施和發佈這個bugfix需要很長時間。通過蘋果審查需要一些時間。等待用戶更新最新版本需要一些時間。等等。

另一方面,通過更新WebApp中的反序列化過程,可以很容易地解決問題。

問題: 是否有可能掛鉤到FOS RestBundle ParamConverter中的反序列化過程?如果我可以在轉換器處理數據之前過濾/清除請求(簡單的搜索/替換錯誤的日期格式),問題可以在幾分鐘內解決。

任何想法/建議如何做到這一點?

謝謝!

回答

1

爲什麼不create your own ParamConverter擴展/使用您從現有需要什麼(例如,在你的情況下,從內置的日期時間ParamConverter,見documentation

你甚至可以設置優先級ParamConverters以確保執行一個之前。

或者是否有什麼特別的你想在這裏實現?

1

你可以預反序列化事件

Example for JMSSerializer

此創建事件監聽器分派的對象進行反序列化之前。您可以使用此 來修改提交的數據,或修改用於反序列化的類型。

此外,你可以爲kernel.request(或kernel.controller優先級比PARAM轉換器監聽priotity更大)事件中,和過濾數據,需要創建監聽器。