如何扩展 FOSRestBundle RequestBodyParamConverter?

How to extend FOSRestBundle RequestBodyParamConverter?

我是 Symfony (5.3) 的新手,想扩展 RequestBodyParamConverter (FOSRestBundle 3.0.5) 以创建 REST api。使用带有 RequestBodyParamConverter@ParamConverter 注释效果很好。但是,我想创建一个自定义转换器,它的工作与 RequestBodyParamConverter 完全相同,再加上一些额外的工作。

我的第一个猜测是简单地扩展 RequestBodyParamConverter 并在 @ParamConverter 注释中提供我的自定义 subclass。但是,RequestBodyParamConverter 被定义为 final,因此无法扩展...

RequestBodyParamConverter / fos_rest.request_body_converter 注入自定义转换器 class (请参见下面的示例)也失败,因为找不到该服务。我认为这是因为它被定义为 private?

所以,我最后的想法是在我的自定义转换器 class 中创建一个 RequestBodyParamConverter。虽然这可行,但我不确定这是否是解决此问题的正确 方法。这样 RequestBodyParamConverter 就创建了两次。这当然没什么特别的,但这是 Symfony 解决这个问题的方法 还是有其他解决方案?

示例:

在自定义转换器中注入 RequestBodyParamConverter class

class MyParamConverter implements ParamConverterInterface {
    protected $parentConverter;
    public function __construct(ParamConverterInterface $parentConverter) {
        $this->parentConverter = $parentConverter;
    }

    public function apply(Request $request, ParamConverter $configuration): bool {
        doExtraWork();
        return $this->parentConverter->apply(...);
    }
}

// config/services.yaml
My\Project\MyParamConverter:
    tags:
        - { name: request.param_converter, converter: my_converter.request_body }
    arguments:
        # both fails since service is not found
        $parentConverter: '@FOS\RestBundle\Request\RequestBodyParamConverter'

        # OR

        $parentConverter: '@fos_rest.request_body_converter'

在自定义转换器中创建 RequestBodyParamConverter class

class MyParamConverter implements ParamConverterInterface {
    protected $parentConverter;
    public function __construct(...parameters necessary to create converter...) {
        $this->parentConverter = new RequestBodyParamConverter(...);
    }

    ...
}

Symfony 提供了一种方法 decorate a registered service

要使用它,您需要在容器中注册的 FOS 服务 ID。

要获取它,您可以使用此命令

symfony console debug:container --tag=request.param_converter

检索要覆盖的服务的 Service ID

然后你可以配置你的服务来装饰FOS one

My\Project\MyParamConverter:
    decorates: 'TheIdOf_FOS_ParamConverterService'
    arguments: [ '@My\Project\MyParamConverter.inner' ] # <-- this is the instance of fos service

也许您需要在此声明中添加 tags,我不确定。

如果您遇到错误,请告诉我。