Php 覆盖FOS静止束响应

Php 覆盖FOS静止束响应,php,rest,symfony,fosrestbundle,Php,Rest,Symfony,Fosrestbundle,我正在为我的RESTful API使用FOS Rest捆绑包,我想覆盖从我的ApiController返回的响应,例如: php 我想要的是向返回的响应添加额外的数据,因此我想要截获这些响应并根据某些条件覆盖它们 我希望api返回的最终结果是: { someAdditionalData1: value1, someAdditionalData2: value2, data: { //the data returned by the controller action

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

php

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

我希望api返回的最终结果是:

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

要了解如何做到这一点,可以查看
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),
    );
}
public function onKernelView(GetResponseForControllerResultEvent $event)
事件为“onKernelView”,即返回视图时。仅当来自控制器的响应实际上不是响应对象时,才会调用此函数。在我的测试中,我返回了一个用户对象,因此调用了它。“50”代表优先权。如果您没有将其设置为高于30,那么将首先调用FOSRestBundle侦听器并设置响应。如果这些侦听器中的任何一个调用
$event->setResponse
,那么其他侦听器将被忽略,因此请确保不要在方法中执行此操作,否则将不会调用FOSRest

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

public static function getSubscribedEvents()
{
    return array(
        KernelEvents::VIEW => array('onKernelView', 50),
    );
}
public function onKernelView(GetResponseForControllerResultEvent $event)
现在,最后,您要做的是统一响应格式。您可以通过更改侦听器方法内事件的控制器结果以匹配所需的格式来完成此操作:

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

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

要了解如何完成此操作,请查看
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),
    );
}
public function onKernelView(GetResponseForControllerResultEvent $event)
事件为“onKernelView”,即返回视图时。仅当来自控制器的响应实际上不是响应对象时,才会调用此函数。在我的测试中,我返回了一个用户对象,因此调用了它。“50”代表优先权。如果您没有将其设置为高于30,那么将首先调用FOSRestBundle侦听器并设置响应。如果这些侦听器中的任何一个调用
$event->setResponse
,那么其他侦听器将被忽略,因此请确保不要在方法中执行此操作,否则将不会调用FOSRest

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

public static function getSubscribedEvents()
{
    return array(
        KernelEvents::VIEW => array('onKernelView', 50),
    );
}
public function onKernelView(GetResponseForControllerResultEvent $event)
现在,最后,您要做的是统一响应格式。您可以通过更改侦听器方法内事件的控制器结果以匹配所需的格式来完成此操作:

$event->setControllerResult([
    'foo' => 'bar',
    'data' => $event->getControllerResult()
]);
如果已设置序列化程序,它仍应按正常方式序列化控制器结果,但您将在响应中获得添加的数据。

您是否阅读了此文档?你看过这些文件了吗?和