5

// MySomethingController.php

// look no s
public function getSomethingAction($args)
{
    ...
}

// 路由.yml

my_something:
    type:     rest
    resource: Blah\Bundle\BlahBundle\Controller\MySomethingController

跑步:

php app/console router:debug

输出:

[router] Current routes
Name                Method     Pattern
get_something       GET        /somethings/{args}.{_format}

为什么路线是“somethings”(复数加一个“s”)而不是“something”?

这是我在某个地方的设置吗?还是这是预期的?

4

2 回答 2

3

挖掘代码后:

这里是:

private function generateUrlParts(array $resources, array $arguments)
{
    $urlParts = array();
    foreach ($resources as $i => $resource) {
        // if we already added all parent routes paths to URL & we have
        // prefix - add it
        if (!empty($this->routePrefix) && $i === count($this->parents)) {
            $urlParts[] = $this->routePrefix;
        }

        // if we have argument for current resource, then it's object.
        // otherwise - it's collection
        if (isset($arguments[$i])) {
            if (null !== $resource) {
                $urlParts[] =
                    strtolower(Pluralization::pluralize($resource))
                    .'/{'.$arguments[$i]->getName().'}';
            } else {
                $urlParts[] = '{'.$arguments[$i]->getName().'}';
            }
        } elseif (null !== $resource) {
            $urlParts[] = strtolower($resource);
        }
    }

    return $urlParts;
}

我打开了一个问题:

希望这将成为可选的

于 2012-06-07T17:07:24.830 回答
3

这是基于@phillpafford 打开的票证的更新答案。

Ismith77 评论了这张票,我想很好地解释了原因:

如果没有复数,我们将不知道方法之间的关系,这将是重要的,例如在实现#52 时。此外,REST 的一个关键思想是,我们将集合中单个元素的 GET 放在集合本身的“子目录”中。

因此,如果您执行“正确”的 REST,那么 /member/{id}.{_format} 的名称会很奇怪,但如果您的集合本身不存在于 /member{.format} 下,那实际上是错误的。

所有这一切的要点是.. 解决方案与其说是为了方便,不如说是关于强制人们实际遵循 REST 原则。

PS:但是我想指出,当你有一个像“数据”这样的词时,它本身就是复数,这有点烦人......

于 2013-04-30T16:19:31.757 回答