我有点挑剔,我希望其中一位更高级的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周围添加上述内容?
如果有任何不清楚的地方,请随时向我询问更多信息。提前谢谢!
答案 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
,如果您想要更改处理响应的方式,则只需要更新一个位置。
我没有对此进行过测试,所以它可能不是正确的,但据我所知它会起作用。我使用了FOSRestBundle
和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;