7

我有三个名为BlogController,的控制器PostControllerCommentControllerCommentController的子资源PostController和的PostController子资源BlogController

/**
 * @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)
    {
    ...
    }
}

路由.yml

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当我将路由器的父级更改为 时mgh_blog,它正在工作!

4

3 回答 3

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 如下所示:

/blog/{blogUri}

它会匹配

public function getAction($blogUri)

子路由 Post 如下所示:

/blog/{blogUri}/post/{postId}

它与下面的代码匹配,因为它需要两个参数。孙子也是如此——它正在寻找三个参数:

public function getAction($postId)

孙子路线,评论,看起来像:

/blog/{blogUri}/post/{postId}/comment/{commentId}

该代码跟踪每个控制器的祖先。帖子有 1 个祖先。在为 post 控制器构建路由时,代码会查看“获取操作”上的参数数量。它采用参数的数量并减去祖先的数量。如果差值不等于 1,则会引发错误。

结论,对于每个后代,它需要包括它的祖先的ID参数和它自己的ID。应该总是比祖先多一个参数。

于 2015-10-21T19:19:09.917 回答
1

你有没有尝试过?:

class CommentController extends FOSRestController
{
    public function getCommentAction($commentId)
    {
    ...
    }
}
于 2015-10-12T18:27:24.140 回答
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)
    {

    }
}
于 2015-10-16T16:01:12.953 回答