2015-03-13 86 views
0

我有點尷尬,我希望更高級的Symfony/FOSRestBundle用戶可以幫助我解決這個問題。用FOSRestBundle返回一個'原始'響應

FOSRestBundle返回響應這樣:

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

的事情是,我保存完整的XML斑點在我的數據庫,因爲其他一些系統依賴於它,這是如下:

<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">[email protected]</email> 
</profile> 

我將它們存儲爲完整的blob,有沒有什麼方法可以在沒有FOSRestBundle的情況下將這些內容添加到我自己的XML中?

如果有任何疑問,請隨時向我諮詢以獲取更多信息。提前致謝!

+0

你可以嘗試不使用'查看對象並返回一個Respo nse',內容設置爲你的XML,內容類型設置爲'application/xml'。 – qooplmao 2015-03-13 09:59:30

+0

這當然有效!謝謝!我只是好奇,如果這是最好的/最好的方法可能,但? – SliceOfLife 2015-03-13 10:27:57

+0

最好的是什麼工作,是乾淨的。可能「最好」的方法是完全圍繞「FOSRestBundle」工作你的編碼,但是你會非常依賴它,並且似乎需要一些不必要的工作。您仍在使用一個簡單的Response對象,因此它非常乾淨,您可以使用給定的'XML'代碼爲您創建一個服務,但這取決於您的偏好以及您將重用的次數它。 – qooplmao 2015-03-13 10:32:13

回答

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;