2013-12-19 2 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"]]}]}]

EDIT:

«Мог ли я сделать что-то вроде этого ниже? Или, поскольку FOSRestBundle использует JMSSerializerBundle, я не должен этого делать?

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

Я должен сказать, что то, что вы пытались достичь, должно было быть единственным и единственным способом для работы пучка с нулевой конфигурацией. FOSRestBundle полностью не соответствует принципу наименьшего сюрприза. – tishma

ответ

3

Существует несколько способов настройки контроллеров с помощью FOSRestBundle. Как вы это делаете, вы должны вернуть представление. Вот ссылка на контроллер отдыха на github, который может немного помочь вам. LiipHelloBundle имеет пример.

Кроме того, мне было проще использовать ClassResourceInterface в моих контроллерах. Таким образом, я возвращаю массив, и он обрабатывает всю сериализацию. Он также использует ваше имя контроллера для генерации необходимых маршрутов, поэтому мне не нужно вручную определять маршруты. Это мой предпочтительный способ настройки контроллера. См. Запись doc 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», а не контекст. – Sehael

Смежные вопросы