我从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 => Object(Sermovi \ Bundle \ ManagementBundle \ Entity \ Transaction))) . ”,“class”:“LogicException”,“trace”: [{ “命名空间”: “”, “short_class”: “”, “类”: “”, “类型”: “”, “功能”: “”, “文件”:“/家/ tirengarfio /工作区/ sermovi /app/bootstrap.php.cache","line":2855,"args":[]},{"namespace":"Symfony\Component\HttpKernel","short_class":"HttpKernel","class “:” 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 \ DependencyInjection \ ContainerAwareHttpKernel“, ”类型“: ” - >“, ”功能“: ”处理“,”文件 “:”/家/ tirengarfio /工作区/ sermovi /应用/ bootstrap.php.cache”, “行”:2247, “ARGS”:[[ “对象”, “的Symfony \元器件\ HttpFoundation \请求”],[ “字符串”, “1”],[ “布尔”,真]]},{ “命名空间”: “的Symfony \元器件\ HttpKernel”, “short_class”: “内核”, “类”:“的Symfony \元器件\ HttpKernel \内核 “ ”类型“: ” - >“, ”功能“: ”处理“, ”文件“: ”/家/ tirengarfio /工作区/ sermovi /网络/ app_dev.php“, ”线“:28,” ARGS “:[[” 对象”, “的Symfony \元器件\ HttpFoundation \请求”]]}]}]
EDIT:
“可能”我在下面做这样的事情?或者由于FOSRestBundle正在使用JMSSerializerBundle,我不应该这样做?
$serializedEntity = $this->container->get('serializer')->serialize($entity, 'json');
return new Response($serializedEntity);
1 回答
有几种方法可以使用FOSRestBundle设置控制器 . 你这样做的方式,你必须返回一个视图 . 这是一个指向github上的休息控制器的链接,可能会帮助你 . LiipHelloBundle有一个例子 .
此外,我发现在我的控制器中使用
ClassResourceInterface
最容易 . 这样,我返回一个数组,它处理所有序列化本身 . 它还使用您的Controller名称生成必要的路由,因此我不必手动定义任何路由 . 这是我设置Controller的首选方式 . 有关其工作原理,请参阅文档条目here .如果您最终使用
ClassResourceInterface
,请确保为每个操作包含以下注释,它将使您返回的数组正确序列化:您甚至可以通过设置控制器的方式来实现这一点,但我之前没有尝试过 . 如果你走那条路就行,请告诉我们 .
UPDATE
对于那些可能对不使用
ClassResourceInterface
而使用FOSRestBundle感兴趣的人,问题中控制器操作的问题是它不返回视图 . 这应该在行动中起作用: