当前位置: 首页 > 知识库问答 >
问题:

覆盖FOS Rest Bundle响应

翟沈义
2023-03-14

我正在为我的RESTful API使用FOS Rest捆绑包,我想覆盖从我的ApiController返回的响应,例如:

PHP

/**
 * @QueryParam(name="sourceAddr", strict=true, requirements="[0-9]{8}", description="Do things")
 * @param $paramFetcher ParamFetcher
 * @return array
 * @throws MtBoxApiException
 */
public function getAuthAction(ParamFetcher $paramFetcher)
{
    return [
        'rfid' => '445545454',
        'fName' => 'adazda',
        'lName' => '8888888',
        'prod' => 75
    ];
}

我想要的是向返回的响应添加额外的数据,因此我想要截获这些响应并根据某些条件覆盖它们。

我想要api返回的最终结果:

{
   someAdditionalData1: value1,
   someAdditionalData2: value2,
   data: {
     //the data returned by the controller action
   }
}

共有1个答案

乌灿
2023-03-14

要了解如何做到这一点,可以查看FOS\RestBundle\EventListener\ViewResponseListener类。它们将此类注册为事件订阅者。您可以在服务中以相同的方式注册类。yml

test_response_listener:
    class: MyBundle\EventListener\MyViewResponseListener
    tags:
        - { name: kernel.event_subscriber }

您需要确保类实现Symfony\Component\EventDispatcher\EventSubscriberInterface,并包含如下方法getSubscribedEvents

public static function getSubscribedEvents()
{
    return array(
        KernelEvents::VIEW => array('onKernelView', 50),
    );
}

事件为“onKernelView”,即返回视图时。仅当来自控制器的响应实际上不是响应对象时,才会调用此函数。在我的测试中,我返回了一个用户对象,因此调用了它。“50”代表优先权。如果您没有将其设置为高于30,那么将首先调用FOSRestBundle侦听器并设置响应。如果这些侦听器中的任何一个调用$event-

onKernelView是要调用的方法的名称。它将接收特定类型的事件,因此让您的方法签名如下所示:

public function onKernelView(GetResponseForControllerResultEvent $event)

现在,最后,您要做的是统一响应格式。您可以通过更改监听器方法中事件的控制器结果来实现这一点,以匹配所需的格式:

$event->setControllerResult([
    'foo' => 'bar',
    'data' => $event->getControllerResult()
]);

如果已设置序列化程序,它仍应按正常方式序列化控制器结果,但您将在响应中获得添加的数据。

 类似资料:
  • 我目前正在创建一个gRPC服务,该服务使用gRPC网关/HTTP反向代理也提供HTTP支持。我想遵循谷歌API设计的常见惯例。 我在Google API设计指南中找到的示例使用了Google。protobuf。清空删除方法/RPC响应的消息。这很好,但是当我生成一个

  • 我正在使用REST服务。我使用swagger编辑器创建了一个API定义,然后我为Springboot服务器生成了代码。在Eclipse中进行了一些更改后,一切正常,但我有一个“问题”,我无法覆盖toString方法以按我想要的方式显示结果。(有一个名为Genre的对象,带有genreId和定义,我不想显示genreId) 这是Controller中的方法实现: 这是Model类中的toString

  • 问题内容: 我们很少有扩展基本类的类。我们注意到我们使用了“退出一些睡眠”方法,并且希望在发生睡眠时进行记录。有没有一种方法可以覆盖Thread.sleep方法,在其中我可以添加一些自定义逻辑(即记录),然后仅调用实际的Thread.sleep()?这样,我就不必更改在我的基类中使用Thread.sleep的所有位置。我也愿意接受其他选择。 问题答案: 您不能重写方法,因为它是本机方法,所以无法对

  • 我正在开发一个Spring集成/引导应用程序。我正在使用一个多文档(src/main/Resources/application.yml)来设置几个配置类的默认值(用@ConfigurationProperties注释)。pplicaiton.yml带有默认值,其中一些需要被覆盖,具体取决于环境。 我可以在目录中使用Java系统属性(-D...=...)、Spring“属性”(--...=...)

  • 问题内容: 我试图在php中覆盖我的位置,但是我仍然在php.ini文件中获得了2 mb的值。 问题答案: 通过进行设置时,这些设置不会有任何效果。 原因是PHP 在 执行脚本 之前 需要这些值。上载时,将在完成上载后执行目标脚本,因此PHP需要事先知道最大大小。 在,虚拟主机配置或文件中进行设置。一个典型的文件如下所示:

  • 问题内容: 我的Java应用程序引用了一个使用log4j日志记录的第三方jar文件。问题是该jar包含自己的log4j.properties文件,这会导致我的机器上的访问被拒绝的异常,但是我无法控制jar文件来更改其内容。 我尝试在应用程序的类路径中添加自己的log4j.properties文件,但似乎没有效果。如果我尝试使用PropertyConfigurator以编程方式导入自己的设置,则lo