退回原始'用FOSRestBundle回复

时间:2015-03-13 09:37:16

标签: symfony fosrestbundle

我有点挑剔,我希望其中一位更高级的Symfony / FOSRestBundle用户可以帮助我解决这个问题。

FOSRestBundle返回响应:

<?xml version="1.0" encoding="UTF-8"?>
 <result>
  <entry>
  </entry>
 </result>

问题是,我在我的数据库中存储了完整的XML blob,因为其他一些系统依赖于它,如下所示:

<profile updated="2015-03-04T10:00">
 <first_name>Peter</first_name>
 <last_name>Pan</last_name>
 <age>34</age>
 <department>Marketing</department>
 <job>Lead Marketing</job>
 <town>New York</town>
 <phone type="work">12345678910</phone>
 <email type="work">user@town.org</email>
</profile>

我将这些存储为完整的blob,有没有什么方法可以返回这些而不用FOSRestBundle在我自己的XML周围添加上述内容?

如果有任何不清楚的地方,请随时向我询问更多信息。提前谢谢!

1 个答案:

答案 0 :(得分:1)

在我的评论中,您可以发送一个响应对象,其内容设置为XML,内容类型设置为application/xml,如...

/** @var XMLModelInterface $xmlModel */
/* $xmlModel populated from your database */
$xmlModel = new XMLModel();

$response = new Response(
    $xmlModel->getContent(),
    Response::HTTP_OK,
    array(
        'Content-Type' => 'application/xml',
    )
);

但要补充一点,你可以做的是设置一个事件监听器来监听kernel.view典型目的:将非响应返回值从控制器转换为响应)并将您的XMLModelInterface转换为回复。这意味着您只需要从控制器返回XMLModelInterface,如果您想要更改处理响应的方式,则只需要更新一个位置。

我没有对此进行过测试,所以它可能不是正确的,但据我所知它会起作用。我使用了FOSRestBundleSensionFrameworkExtraBundle中的一些信息,所以它应该没问题。

活动订阅者

class XMLModelResponseSubscriber implements EventSubscriberInterface
{
    /**
     * Converts a returned XMLModelInterface to a Response object
     *
     * @param GetResponseForControllerResultEvent $event
     */
    public function onKernelView(GetResponseForControllerResultEvent $event)
    {
        // If controller result is not a XMLModelInterface ignore
        if (!is_a($event->getControllerResult(), 'Acme/SomeBundle/Model/XMLModelInterface')) {
            return;
        }

        $response = new Response(
            $event->getControllerResult()->getContent(),
            Response::HTTP_OK,
            array(
                'Content-Type' => 'application/xml',
            )
        );

        $event->setControllerResult($response);
    }

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

Services.yml

services:
    acme.subscriber.xml_model_response:
        class: Acme\SomeBundle\EventSubscriber\XMLModelResponseSubscriber
        tags:
            - { name: kernel.event_subscriber }

然后在你的控制器中你会做..

/** @var XMLModelInterface $xmlModel */
/* $xmlModel populated from your database */
$xmlModel = new XMLModel();

return $xmlModel;