如何扩展 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
,我不确定。
如果您遇到错误,请告诉我。
我是 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
,我不确定。
如果您遇到错误,请告诉我。