我正在将现有的Symfony 2.8
项目迁移到Symfony 3.4
。除了Symfony版本之外,sensio/framework-extra-bundle
也从3.0.19
更新为5.2.4
。
该项目对两个不同的控制器使用分离ParamConverter
。尽管此方法在Symfony 2.8
项目中工作正常,但在Symfony 3.4
项目中失败了。看来现在两个转换器都应用于两个控制器。
// The first controller uses a standard `fos_rest.request_body` converter
class ControllerA extends FOSRestController {
/**
* @FOSRest\View()
* @ParamConverter("chartOptions", converter="fos_rest.request_body")
*/
public function chartDataAction(Request $request, ChartOptions $chartOptions) {
...
}
}
class ChartOptions {
public $date;
public $name;
public $title;
}
// The second controller uses a FOS\RestBundle\Request\RequestBodyParamConverter subclass as converter
class ControllerB extends FOSRestController {
/**
* @FOSRest\View()
* @ParamConverter("dataBag", converter="custom_converter")
*/
public function dataAction(Request $request, DataBag $dataBag) {
...
}
}
class CustomConverter extend RequestBodyParamConverter {
...
public function apply(Request $request, ParamConverter $configuration) { ... }
}
// services.yml
...
AppBundle\Util\CustomConverter:
autowire: true
tags:
- { name: request.param_converter, converter: custom_converter }
arguments:
$serializer: '@fos_rest.serializer'
$validator: '@?fos_rest.validator'
我假设这两个转换器中的每一个仅在调用相应的控制器时才应用。这在Symfony 2.8
中有效,但在Symfony 3.4
中却不是。
当我打开一个使用chartDataAction()
调用Ajax
的页面时,会引发CustomConverter.apply(...)
异常。问题是,apply()
方法并不旨在处理通话内容。
我当然可以捕获/处理异常,但这不能解决整体问题:为什么在此通话中根本使用CustomConverter
?
经过一些研究,我试图通过在auto_convert
中将false
设置为config.yml
来解决问题:
# app/config/config.yml
sensio_framework_extra:
request:
converters: true
auto_convert: false
虽然这似乎可以解决CustomConverter
的问题,但我现在又得到了一个例外:
未捕获的PHP异常RuntimeException:“转换器 'fos_rest.request_body'不支持参数转换 'chartOptions'
那么,问题的原因可能是什么?如何仅将转换器应用于特定控制器?
编辑:
重新阅读Symfony docs后,这种行为使我更加困惑:
要检测哪个转换器在参数上运行,请执行以下过程 运行:
如果使用@ParamConverter(converter =“ name”)做出了明确的转换器选择,则给定名称的转换器为 选择。否则,将按优先级迭代所有已注册的参数转换器。
两个控制器都使用@ParamConverter(converter="name")
指定转换器。那么为什么将custom_converter
而不是chartDataAction()
应用于fos_rest.request_body
。 ?