首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何扩展FOSRestBundle RequestBodyParamConverter?

如何扩展FOSRestBundle RequestBodyParamConverter?
EN

Stack Overflow用户
提问于 2021-08-10 13:12:15
回答 1查看 185关注 0票数 2

我是Symfony (5.3)的新手,我希望扩展RequestBodyParamConverter (FOSRestBundle 3.0.5)来创建REST。将@ParamConverter注释与RequestBodyParamConverter一起使用可以很好地工作。但是,我想创建一个自定义转换器,它与RequestBodyParamConverter完成完全相同的工作,外加一些额外的工作。

我最初的猜测是简单地扩展RequestBodyParamConverter并在@ParamConverter注释中提供我的自定义子类。但是,RequestBodyParamConverter被定义为final,因此不能扩展.

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

因此,我的最后一个想法是在我的自定义转换器类中创建一个RequestBodyParamConverter。虽然这是可行的,但我不知道这是否解决这个问题的正确方法。通过这种方式创建两次RequestBodyParamConverter。当然,这没有什么特别之处,但这是Symfony解决这个问题的方法,还是有其他解决方案?

示例:

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

代码语言:javascript
复制
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

代码语言:javascript
复制
class MyParamConverter implements ParamConverterInterface {
    protected $parentConverter;
    public function __construct(...parameters necessary to create converter...) {
        $this->parentConverter = new RequestBodyParamConverter(...);
    }

    ...
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-10 17:46:10

Symfony提供了一种实现装饰注册服务的方法

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

要获得它,可以使用以下命令

代码语言:javascript
复制
symfony console debug:container --tag=request.param_converter

检索要重写的服务的Service ID

然后,您可以配置您的服务来装饰FOS one。

代码语言:javascript
复制
My\Project\MyParamConverter:
    decorates: 'TheIdOf_FOS_ParamConverterService'
    arguments: [ '@My\Project\MyParamConverter.inner' ] # <-- this is the instance of fos service

也许您需要将tags添加到这个声明中,我不确定。

如果你面临错误请告诉我。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68727506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档