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;
我有点困惑,我希望更高级的 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;