Как применить ParamConverter только к определенному контроллеру? - PullRequest
0 голосов
/ 10 января 2019

Я работаю над переносом существующего проекта 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.

...