覆盖 FOS Rest Bundle 响应

Override FOS Rest Bundle response

我正在为我的 RESTful API 使用 FOS Rest Bundle,我想覆盖从我的 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 returns:

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

要了解这是如何完成的,您可以查看 FOS\RestBundle\EventListener\ViewResponseListener class。他们将此 class 注册为事件订阅者。您可以在 services.yml

中以相同的方式注册您的 class
test_response_listener:
    class: MyBundle\EventListener\MyViewResponseListener
    tags:
        - { name: kernel.event_subscriber }

您需要确保您的 class 实现 Symfony\Component\EventDispatcher\EventSubscriberInterface 并包含方法 getSubscribedEvents,如下所示:

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

事件是 'onKernelView',即返回视图时。仅当来自控制器的响应实际上不是 Response 对象时才会调用此方法。在我对此的测试中,我返回了一个用户对象,所以它被调用了。 “50”代表优先级。如果您不将其设置为高于 30,则将首先调用 FOSRestBundle 侦听器并设置响应。如果这些侦听器中的任何一个调用 $event->setResponse,那么其他侦听器将被忽略,因此请确保您不要在您的方法中执行此操作,否则不会调用 FOSRest。

onKernelView是要调用的方法名。它会收到某种类型的事件,所以你的方法签名是这样的:

public function onKernelView(GetResponseForControllerResultEvent $event)

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

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

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