该项目基于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_
答案 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 [];
}
以上检查是否为空。