正如我的評論,你可以發送一個響應對象設置爲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;
你可以嘗試不使用'查看對象並返回一個Respo nse',內容設置爲你的XML,內容類型設置爲'application/xml'。 – qooplmao 2015-03-13 09:59:30
這當然有效!謝謝!我只是好奇,如果這是最好的/最好的方法可能,但? – SliceOfLife 2015-03-13 10:27:57
最好的是什麼工作,是乾淨的。可能「最好」的方法是完全圍繞「FOSRestBundle」工作你的編碼,但是你會非常依賴它,並且似乎需要一些不必要的工作。您仍在使用一個簡單的Response對象,因此它非常乾淨,您可以使用給定的'XML'代碼爲您創建一個服務,但這取決於您的偏好以及您將重用的次數它。 – qooplmao 2015-03-13 10:32:13