代码之家  ›  专栏  ›  技术社区  ›  Andrei Herford

为什么/如何工作:symfony2.8+FOSRestBundle自动反序列化请求对象

  •  1
  • Andrei Herford  · 技术社区  · 6 年前

    Symfony 2.8 不是我创造的。前几位开发者无法回答问题。

    大多数代码都很容易理解,但有一次我根本搞不懂为什么要这样做:

    从控制器参数自动反序列化 JSON

    这很好,但是如果不理解它在这种情况下为什么会起作用,我就无法理解为什么在将项目迁移到 Symfony 3.4 ...

    使用以下捆绑包

    sensio/framework-extra-bundle       v3.0.29
    friendsofsymfony/rest-bundle        2.4.0
    jms/serializer                      1.13.0 
    jms/serializer-bundle               1.5.0 
    

    配置:

    // app/config/config.yml
    sensio_framework_extra:
        request: { converters: true }
    
    fos_rest:
        ...
        body_converter:
            enabled: true
    
    #jms_serializer:  (not configured)
    #    ...
    

    代码:

    // src/AppBundle/Util/SortInfo.php
    class SortInfo {
        public $sortOrder;
        public $sortBy;
    }
    
    
    // src/AppBundle/Resources/serializer/Util.SortInfo.yml
    AppBundle\Util\SortInfo:
        exclusion_policy: ALL
        properties:
            sortOrder:
                type: string
                expose: true
            sortBy:
                type: string
                expose: true
    
    // src/AppBundle/Controller/SortingController.php
    class SortingController extends Controller {
        ...
    
        /**
         * @FOSRest\View()
         */
        public function sortAction(SortInfo $sortInfo) {
            $this->logger->info("sortAction");
            $this->logger->info("   ".gettype($sortInfo)."  --  ".get_class($sortInfo));
            $this->logger->info("   ".$sortInfo->sortOrder."  --  ".$sortInfo->sortBy);
    
            ...
        }     
    }
    

    就这样。 在挖掘了几个小时之后,我找不到任何明确的配置来告诉 sortAction 方法转换 JSON格式 自动从请求中获取数据。

    有以下内容的请求 JSON格式 内容将导致以下日志输出:

    // JSON content
    {"sortOrder":"ASC", "sortBy":"name"}
    
    // Log output
    sortAction
        object  --  AppBundle\Util\SortInfo
        ASC  --  name
    

    为什么这样做有效?

    如前所述,这是好的,但问题是,相同的代码不能工作 以及FOSRest、ExtrasBundle和JMSSerializer的更新版本:

    sensio/framework-extra-bundle       v5.2.4
    friendsofsymfony/rest-bundle        2.5.0
    jms/serializer                      2.1.0
    jms/serializer-bundle               3.0.0 
    

    同样的请求 JSON格式

    // Log output
    sortAction
        object  --  AppBundle\Util\SortInfo
          --  
    

    所以尽管 SortInfo sortBy sortOrder 属性为空/空。

    怎么会这样?我不明白为什么首先要对数据进行反序列化,但是如何能够创建一个 索尔廷佛

    这个 Util.SortInfo.yml 文件是进程所必需的。删除此文件会导致异常:

    必须为 AppBundle\Util\SortInfo::$sortBy。“

    在/../vendor/friendsofsymfony/rest bundle/Request/ 雷克stBodyParamConverter.php

    在这里我不明白为什么 SortInfo::$sortBy 是个问题,但不是 索尔廷佛 它自己。在中另外删除文件

    但至少这个错误信息证实了 RequestBodyParamConverter 参与了这个过程。

    遵循 Symfony docs 应该有必要手动指定应该转换的参数(尽管没有这个配置,它仍然可以正常工作 符号2.8 ):

    /**
     * @FOSRest\View()
     * @ParamConverter("sortInfo", converter="fos_rest.request_body")
     */
    public function sortAction(SortInfo $sortInfo) {
        ...
    }
    

    :

    “fos”系列_rest.request_body休息请求'不支持参数转换 '$sortInfo''

    底线:

    • 这一切都很神秘。
    • 为什么它在
    0 回复  |  直到 6 年前