@Route注释,可选参数不是可选的

时间:2016-12-16 21:33:22

标签: routing annotations symfony

我注释了一个Symfony3控制器方法,其路径应该在最后一个位置采用可选参数。如果我尝试生成没有最后一个参数的路由,我要么得到一个看起来像我想要但不起作用的路由(fos-js-routing)或者我无法生成路由(twig)。我希望@Route注释中只有一个拼写错误,但我看不到它。这是代码。

如果提供了两个参数,该路线确实有效。

控制器方法:

    /**
     * @Route("/new/{format_id}/{room_id}", name="ci_item_new", requirements={"format_id"="\d+"}, options={"expose"=true})
     * @ParamConverter("format", options={"id" = "format_id"})
     * @ParamConverter("room", options={"id" = "room_id"})
     * @param Request $request
     * @param SupplyFormat
     * @param Room|null
     * @return array
     */
    public function newAction(Request $request, SupplyFormat $format, Room $room = null)
    {
        $item = new Item();
        $item->setFormat($format);
        if($room) $item->setRoom($room);
...
    }

fos:js-routing call:

Routing.generate('ci_item_new', {'format_id': data.format.id})

路由生成:

https://example.com/web/app_dev.php/item/new/2205< - observe == expected

尝试URL时出现

错误消息

找不到“GET / item / new / 2205”的路线(来自“https://example.com/web/app_dev.php/supply/show/1

twig路由呼叫:

{{ path('ci_item_new', {'format_id': supply.formats[0]}) }}

没有生成路线

错误消息

在呈现模板期间抛出异常(“缺少一些必需参数(”room_id“)以生成路径”ci_item_new“的URL。”)。

为什么我的@Route注释不起作用?我已经阅读了thisthis以及其他一些没有找到我需要的内容。

1 个答案:

答案 0 :(得分:0)

您也应该在函数参数中包含参数,并使用相同的名称,然后您不需要@ParamConverter。此外,您需要指定默认值以避免不传递可选参数。所以这将是你的改变:

/**
 * @Route("/new/{format_id}/{room_id}",
 *      defaults={"format_id" = 0, "room_id" = 0},
 *      name="ci_item_new",
 *      requirements={"format_id"="\d+"})
 * @param Request $request
 * @param SupplyFormat
 * @param Room|null
 * @return array
 */
public function newAction($format_id, $room_id, Request $request)
{
    $item = new Item();
    $item->setFormat($format_id);
    if($room_id) $item->setRoom($room_id);
...
}

我认为这应该适合你,但我没有尝试过。

显然,你需要检查参数是否为0等等......