当我在FOS Rest Bundle中拥有多级子资源时,每个父控制器必须具有`get {SINGULAR} Action($ id)`方法

时间:2015-10-12 18:16:48

标签: symfony fosrestbundle symfony-2.7

我有三个名为BlogControllerPostControllerCommentController的控制器CommentControllerPostController的子资源和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时,它正在运行!

3 个答案:

答案 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)
    {

    }
}