覆盖FOS Rest Bundle响应

时间:2016-10-09 20:11:18

标签: php rest symfony fosrestbundle

我使用FOS Rest Bundle作为我的RESTful API,我想覆盖从我的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 个答案:

答案 0 :(得分:2)

要了解如何完成此操作,您可以查看FOS\RestBundle\EventListener\ViewResponseListener类。他们将此课程注册为活动订阅者。您可以在services.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',即返回视图时。仅当来自控制器的响应实际上不是Response对象时才会调用此方法。在我的测试中,我返回了一个User对象,因此它被调用了。 “50”代表优先权。如果你没有把它高于30,那么将首先调用FOSRestBundle监听器并设置响应。如果这些侦听器中的任何一个调用$event->setResponse,则忽略其他侦听器,因此请确保您不在您的方法中执行此操作,否则将不会调用FOSRest。

onKernelView是要调用的方法的名称。它会收到某种类型的事件,所以请按照以下方式签名:

public function onKernelView(GetResponseForControllerResultEvent $event)

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

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

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