2013-12-19 128 views
2

我以FOSRestBundle開頭。我加入這個路由配置:FOSRestBundle:控制器必須返回給出的響應(Array())

//Sermovi/Bundle/APIBundle/Resources/config/routing.yml  
sermovi_api_homepage: 
     type: rest 
     resource: Sermovi\Bundle\APIBundle\Controller\DefaultController 

//app/config/routing.yml  
sermovi_api: 
    type: rest 
    prefix: /api 
    resource: "@SermoviAPIBundle/Resources/config/routing.yml" 

這config.yml

fos_rest: 
    routing_loader: 
     default_format: json 
    view: 
     view_response_listener: true 

sensio_framework_extra: 
    view: 
     annotations: false 

而這個控制器:

namespace Sermovi\Bundle\APIBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use FOS\RestBundle\Controller\FOSRestController; 
use Symfony\Component\HttpFoundation\Response; 


class DefaultController extends FOSRestController 
{ 
    public function getArticlesAction() 
    { 
     $em = $this->getDoctrine()->getManager(); 

     $entity = $em->getRepository('SermoviManagementBundle:Transaction')->find(776); 

     return array(
      'entity' => $entity 
     ); 
    } 
} 

而且我得到這個錯誤:

[{"message":"The controller must return a response (Array(entity => Object(Sermovi\Bundle\ManagementBundle\Entity\Transaction)) given).","class":"LogicException","trace":[{"namespace":"","short_class":"","class":"","type":"","function":"","file":"/home/tirengarfio/workspace/sermovi/app/bootstrap.php.cache","line":2855,"args":[]},{"namespace":"Symfony\Component\HttpKernel","short_class":"HttpKernel","class":"Symfony\Component\HttpKernel\HttpKernel","type":"->","function":"handleRaw","file":"/home/tirengarfio/workspace/sermovi/app/bootstrap.php.cache","line":2817,"args":[["object","Symfony\Component\HttpFoundation\Request"],["string","1"]]},{"namespace":"Symfony\Component\HttpKernel","short_class":"HttpKernel","class":"Symfony\Component\HttpKernel\HttpKernel","type":"->","function":"handle","file":"/home/tirengarfio/workspace/sermovi/app/bootstrap.php.cache","line":2946,"args":[["object","Symfony\Component\HttpFoundation\Request"],["string","1"],["boolean",true]]},{"namespace":"Symfony\Component\HttpKernel\DependencyInjection","short_class":"ContainerAwareHttpKernel","class":"Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel","type":"->","function":"handle","file":"/home/tirengarfio/workspace/sermovi/app/bootstrap.php.cache","line":2247,"args":[["object","Symfony\Component\HttpFoundation\Request"],["string","1"],["boolean",true]]},{"namespace":"Symfony\Component\HttpKernel","short_class":"Kernel","class":"Symfony\Component\HttpKernel\Kernel","type":"->","function":"handle","file":"/home/tirengarfio/workspace/sermovi/web/app_dev.php","line":28,"args":[["object","Symfony\Component\HttpFoundation\Request"]]}]}]

編輯:

「可以」我做下面這樣的事情?或者因爲FOSRestBundle使用JMSSerializerBundle我不應該這樣做?

$serializedEntity = $this->container->get('serializer')->serialize($entity, 'json'); 
return new Response($serializedEntity); 
+3

我必須說,你試圖實現的應該是該軟件包以零配置工作的唯一方法。 FOSRestBundle完全不符合最低驚奇原則。 – tishma

回答

3

有幾種方法可以用FOSRestBundle設置控制器。你這樣做的方式,你必須返回一個視圖。這是一個鏈接到github上的休息控制器,可以幫助你一點。 LiipHelloBundle有一個例子。

此外,我發現在我的控制器中最容易使用ClassResourceInterface。這樣,我返回一個數組,並處理所有的序列化本身。它也使用您的控制器名稱來生成必要的路由,所以我不必手動定義任何路由。這是我設置控制器的首選方式。請參閱文檔條目here瞭解它的工作原理。

如果你最終使用的ClassResourceInterface,一定要包括每個動作以下標註,它將使使你返回數組正確連載:

use FOS\RestBundle\Controller\Annotations as Rest; 
//..... 

/** 
* @Rest\View() 
*/ 
public function cgetAction() {} 

你甚至可能能夠做到用你設置控制器的方式,但我沒有嘗試過。讓我們知道,如果你走這條路,它的作品。

UPDATE

對於那些誰可能有興趣在使用FOSRestBundle不使用ClassResourceInterface,隨着問題的控制器操作的問題是,它不返回視圖。這應該在行動中起作用:

class DefaultController extends FOSRestController 
{ 
    public function getArticlesAction() 
    { 
     $em = $this->getDoctrine()->getManager(); 

     $entity = $em->getRepository('SermoviManagementBundle:Transaction')->find(776); 
     $statusCode = 200; 

     $view = $this->view($entity, $statusCode); 
     return $this->handleView($view); 
    } 
} 
+0

如何注入一個服務(例如Doctrine)以用於ClassResourceInterface?隨着覆蓋,你有我的投票。就此而言,文檔確實無法提供完整的示例。 Cheers – tishma

+0

@tishma我很肯定你可以像平常一樣使用上下文感知方法來獲得Doctrine,所以'$ this-> getDoctrine()' – Sehael

+0

對不起,應該說'container aware',而不是context aware。 – Sehael

相關問題