我注释了一个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);
...
}
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)
{{ path('ci_item_new', {'format_id': supply.formats[0]}) }}
在呈现模板期间抛出异常(“缺少一些必需参数(”room_id“)以生成路径”ci_item_new“的URL。”)。
答案 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等等......