Я работаю над миграцией существующего 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’
Итак, что может быть причиной проблемы? Как применять преобразователи только для конкретных контроллеров?
РЕДАКТИРОВАТЬ:
После перечитывания Symfony документы Меня еще больше смущает это поведение:
Чтобы определить, какой преобразователь работает по параметру, выполните следующий процесс
выполняется:Если с помощью @ParamConverter (converter = «name») был сделан явный выбор конвертера, конвертер с указанным именем будет
выбран. В противном случае все зарегистрированные преобразователи параметров повторяются по приоритету.
Оба контроллера указывают конвертер, используя @ParamConverter(converter="name")
, Так почему же custom_converter
применительно к chartDataAction()
вместо fos_rest.request_body
, ?
Задача ещё не решена.
Других решений пока нет …