我从FOSRestBundle开始。我添加了这个路由配置:
//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”:“控制器必须返回响应(Array(entity => 对象(Sermovi \包\ ManagementBundle \实体\事务)) 定) “” 类 “:” LogicException”, “跟踪”:[{ “命名空间”: “”, “short_class”: “”, “类”: “”, “类型”: “”, “功能” : “”, “文件”: “/家/ tirengarfio /工作区/ sermovi /应用/ bootstrap.php.cache”, “行”:2855, “ARGS”:[]},{ “命名空间”:“的Symfony \元器件\ HttpKernel “ ”short_class“: ”HttpKernel“, ”类“: ”的Symfony \元器件\ HttpKernel \ HttpKernel“, ”类型“: ” - >“ 中, ”功能“: ”handleRaw“, ”文件“:”/家/ tirengarfio /工作区/ sermovi /应用/ bootstrap.php.cache “ ”行“:2817, ”ARGS“:[[ ”对象“, ”的Symfony \元器件\ HttpFoundation \请求“],[ ”字符串“,” 1 “]]},{” 命名空间 “:” 的Symfony \元器件\ HttpKernel”, “short_class”: “HttpKernel”, “类”: “的Symfony \元器件\ HttpKernel \ HttpKernel”, “类型”: “ - >” 中, “功能”: “处理”, “文件”: “/家/ tirengarfio /工作区/ sermovi /应用/ bootstrap.php.cache”, “行”:2946, “ARGS”:[[ “对象”,“的Symfony \组件\ HttpFoundation \请求 “],[” 字符串 “ ”1“],[ ”布尔“,真]]},{ ”命名空间“: ”的Symfony \元器件\ HttpKernel \ DependencyInjection“, ”short_class“:” ContainerAwareHttpKernel “ ”阶级“:” Symfony的\分量\ HttpKernel \德pendencyInjection \ ContainerAwareHttpKernel”, “类型”: “ - >” 中, “功能”: “处理”, “文件”: “/家/ tirengarfio /工作区/ sermovi /应用/ bootstrap.php.cache”, “行”: 2247, “ARGS”:[[ “对象”, “的Symfony \元器件\ HttpFoundation \请求”],[ “字符串”, “1”],[ “布尔”,真]]},{ “命名空间”:“的Symfony \组件\ HttpKernel”, “short_class”: “内核”, “类”: “的Symfony \元器件\ HttpKernel \内核”, “类型”: “ - >” 中, “功能”: “处理”, “文件”: “/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);
答案 0 :(得分:4)
有几种方法可以使用FOSRestBundle设置控制器。你这样做的方式,你必须返回一个视图。这是一个指向github上的休息控制器的链接,可能会帮助你。 LiipHelloBundle有一个例子。
另外,我发现在我的控制器中使用ClassResourceInterface
最容易。这样,我返回一个数组,它处理所有序列化本身。它还使用您的Controller名称生成必要的路由,因此我不必手动定义任何路由。这是我设置Controller的首选方式。有关其工作原理,请参阅文档条目here。
如果您最终使用ClassResourceInterface
,请确保为每个操作都包含以下注释,它将使您返回的数组正确序列化:
use FOS\RestBundle\Controller\Annotations as Rest;
//.....
/**
* @Rest\View()
*/
public function cgetAction() {}
您甚至可以通过设置控制器的方式来实现这一点,但我之前没有尝试过。如果你这样做,请告诉我们它是否有效。
<强>更新强>
对于那些可能对不使用ClassResourceInterface
而使用FOSRestBundle感兴趣的人,问题中控制器操作的问题是它不返回视图。这应该在行动中起作用:
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);
}
}