Return 使用 FOSRestBundle 的 'raw' 响应

Return a 'raw' response with FOSRestBundle

我有点困惑,我希望更高级的 Symfony / FOSRestBundle 用户之一可以帮助我解决这个问题。

FOSRestBundle return 的响应如下:

<?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,有什么方法可以 return 这些而不用 FOSRestBundle 在我自己的周围添加上述内容 XML?

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

在我的评论中,您可以发送一个内容设置为 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典型用途:转换无响应 return 值从控制器转换为响应)并将您的 XMLModelInterface 转换为响应。这意味着您只需要从您的控制器 return 一个 XMLModelInterface 并且如果您想更改响应的处理方式,您将只有一个地方可以更新。

我还没有测试过这个,所以它可能不正确,但据我所知它会起作用。我使用了 FOSRestBundle and the SensionFrameworkExtraBundle 的一些信息,所以应该没问题。

事件订阅者

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;