未找到Symfony3 FOSRest cgetAction路由

时间:2016-06-30 12:30:29

标签: symfony fosrestbundle

该项目基于Symfony 3.1 + FOSRest 2.0。

我有一个控制器,有以下方法:

...
public function cgetCategoryAction()
{
    $em = $this->getDoctrine()->getManager();
    $entity = $em->getRepository('AppBundle:Category')->findAll();

    if (!$entity) {
        return [];
    }

    return $entity;
}

public function getCategoryAction($id)
{
    $em = $this->getDoctrine()->getManager();
    $entity = $em->getRepository('AppBundle:Category')->find($id);

    if (!$entity) {
        throw new NotFoundHttpException(sprintf('The resource \'%s\' was not found.', $id));
    }

    return $entity;
}
...

GET /api/categories/1会传递结果,但GET /api/categories会导致405 Route not found。在最后添加斜杠并不能解决问题。

根据名称惯例,cgetAction应按GET /请求提供实体集合。我做错了什么?

更新

routing.yml

app:
    type:     rest
    prefix:   /api
    resource: "@AppBundle/Resources/config/api-routing.yml"
NelmioApiDocBundle:
    resource: "@NelmioApiDocBundle/Resources/config/routing.yml"
    prefix:   /api/doc

routing-api.yml

api_Category:
    type: rest
    resource: "@AppBundle/Controller/CategoryController.php"
    name_prefix:  api_
api_Product:
    type: rest
    resource: "@AppBundle/Controller/ProductController.php"
name_prefix:  api_

2 个答案:

答案 0 :(得分:1)

我刚遇到同样的问题。看起来在控制器中首先声明的操作会被第二个覆盖。即。如果首先声明cgetCategoryAction,则getCategoryAction将替换它。所以如果你换掉他们的订单,你就会遇到相反的问题。只生成其中一条路线。

我解决了这个问题 implicit resource naming

添加实现ClassResourceInterface,并删除'类别'从动作名称 - FOSRestBundle将从控制器名称中解决这个问题。

use FOS\RestBundle\Routing\ClassResourceInterface;


class CategoryController extends Controller implements ClassResourceInterface {

    public function cgetAction() {...}

    public function getAction($id) {...}
}

您可以使用以下命令从控制台检查自动生成的路由的外观:

php app/console router:debug

答案 1 :(得分:0)

顺便说一下,在你的代码中:

' '.join

这不会按照你期望的方式运作。 $ entity是一个结果集。所以你需要检查计数:

if (!$entity) {
   return [];
}

以上检查是否为空。