Я работаю над переносом существующего проекта 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
, теперь я получаю еще одно исключение:
Uncaught PHP Exception RuntimeException: «Конвертер
'fos_rest.request_body' не поддерживает преобразование параметра
'ChartOptions'
Итак, в чем может быть причина проблемы? Как применять преобразователи только для определенных контроллеров?
EDIT:
После перечитывания документов Symfony меня еще больше смущает это поведение:
Чтобы определить, какой преобразователь работает по параметру, выполните следующий процесс
выполняется:
Если явный выбор конвертера был сделан с помощью @ParamConverter (converter = "name"), конвертер с указанным именем будет
выбран. В противном случае все зарегистрированные преобразователи параметров повторяются по приоритету.
Оба контроллера указывают конвертер, используя @ParamConverter(converter="name")
. Так почему custom_converter
применяется к chartDataAction()
вместо fos_rest.request_body
.