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''
底线: