如何仅将ParamConverter应用于特定的控制器?

时间:2019-01-10 15:26:20

标签: php symfony autowired

我正在将现有的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。 ?

0 个答案:

没有答案