我有三个名为BlogController
,PostController
,CommentController
的控制器CommentController
是PostController
的子资源和PostController
子资源{ {1}}。
BlogController
的routing.yml
/**
* @Rest\RouteResource("blog", pluralize=false)
*/
class BlogController extends FOSRestController
{
public function getAction($blogUri)
{
...
}
}
/**
* @Rest\RouteResource("post", pluralize=false)
*/
class PostController extends FOSRestController
{
public function getAction($postId)
{
...
}
}
/**
* @Rest\RouteResource("comment", pluralize=false)
*/
class CommentController extends FOSRestController
{
public function getAction($commentId)
{
...
}
}
我定义了mgh_blog:
resource: MGH\BlogBundle\Controller\BlogController
type: rest
mgh_blog_post:
resource: MGH\BlogBundle\Controller\PostController
type: rest
parent: mgh_blog
mgh_blog_post_comment:
resource: MGH\PostBundle\Controller\CommentController
type: rest
parent: mgh_blog_post
个方法,但是我收到了以下错误:
getAction
编辑:
我还尝试将方法的名称更改为[InvalidArgumentException]
Every parent controller must have `get{SINGULAR}Action($id)` method
where {SINGULAR} is a singular form of associated object
,getCommentAction($commentId)
和getPostAction($postId)
,但不起作用。
当我使用getBlogAction
注释时,方法名称必须为@RouteResource
,否则它无法正常工作。
当我将getAction($id)
路由器的父级更改为mgh_blog_post_comment
时,它正在运行!
答案 0 :(得分:5)
这个错误描述非常糟糕,浪费时间,因为它没有告诉你真正的问题是什么。请尝试以下方法:
/**
* @Rest\RouteResource("blog", pluralize=false)
*/
class BlogController extends FOSRestController
{
public function getAction($blogUri)
{
...
}
}
/**
* @Rest\RouteResource("post", pluralize=false)
*/
class PostController extends FOSRestController
{
public function getAction($blogUri, $postId)
{
...
}
}
/**
* @Rest\RouteResource("comment", pluralize=false)
*/
class CommentController extends FOSRestController
{
public function getAction($blogUri, $postId, $commentId)
{
...
}
}
您在后代控制器操作中没有正确数量的参数。我花了两天的步调试来解决这个问题。
父路线博客看起来像:
/blog/{blogUri}
匹配
public function getAction($blogUri)
子路线Post,看起来像:
/blog/{blogUri}/post/{postId}
匹配下面的代码,因为它需要两个参数。对于孙子来说也是如此 - 它正在寻找三个参数:
public function getAction($postId)
孙子路线,评论,看起来像:
/blog/{blogUri}/post/{postId}/comment/{commentId}
代码跟踪每个控制器的祖先。 这篇文章有1个祖先。在为post控制器构建路由时,代码会查看“get action”上的参数数量。它取参数的数量并减去祖先的数量。如果差异不等于1,则会抛出错误。
结论,对于每个后代,它需要包括它的祖先的ID参数和它自己的ID。应该总是有一个参数而不是祖先。
答案 1 :(得分:1)
你试过吗?:
class CommentController extends FOSRestController
{
public function getCommentAction($commentId)
{
...
}
}
答案 2 :(得分:1)
尝试:
public function cgetAction(Request $request)
{
...
}
这是我的控制器示例:
<?php
namespace Cf\SClinicBundle\Controller;
use Symfony\Component\HttpFoundation\Request;
use FOS\RestBundle\Controller\FOSRestController;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Controller\Annotations\RouteResource;
use Cf\SClinicBundle\Entity\CfAcquireImage;
use Doctrine\DBAL\DBALException as DBALException;
use Doctrine\ORM\NoResultException as NoResultException;
/**
* CfAcquireImage controller.
*
* @RouteResource("acquire-image")
*/
class ApiCfAcquireImageController extends FOSRestController
{
/**
* @var array
*/
public $status;
/**
* @var
*/
public $parameter;
/**
* @var
*/
private $role_name;
/**
* Constructor
*/
public function __construct()
{
}
/**
* Lists all Cf Acquire Image entities.
*
* @param Request $request
*
* @return mixed
*/
public function cgetAction(Request $request)
{
}
/**
* Finds a Cf Acquire Image entity by id.
*
* @param Request $request
* @param $id $id
*
* @return array
*/
public function getAction(Request $request, $id)
{
}
/**
* Create a new Cf Acquire Image entity.
*
* @param Request $request
*
* @return mixed
*/
public function postAction(Request $request)
{
}
/**
* @param Request $request
* @param $id
*
* @return array
*/
public function putAction(Request $request, $id)
{
}
/**
* Deletes a Cf Acquire Image entity.
*
* @param Request $request
* @param $id
*
* @return mixed
*/
public function deleteAction(Request $request, $id)
{
}
}