symfony 2路由参数&名称

时间:2011-12-07 06:26:29

标签: routes symfony

我有一条symfony 2路线,如:

/**
 * @Route("/thing/add/{id}", name="addThing")
 */
function addThing(Request $req) {

当我访问/thing/add/1时,symfony 2抱怨:

  

“addThing”路由有一些缺少必需参数(“id”)。

但是在分析器中,我看到“请求属性”,“id”= 1.但是在GET(或POST)中没有任何内容。问题是什么?

更新

如果我删除name="addThing"它有效...但我如何访问该表单操作的路由?

2 个答案:

答案 0 :(得分:2)

我将完成@scube提供的答案。

首先,您不应直接在控制器的动作功能中传递Request对象。原因是这些函数中的参数(在控制器中用作动作的函数)仅用于将url的一部分映射到参数中。例如,如果我有一个像@Route(/blog/{year}/{month}/{day)这样的注释,那么,对于要填充的参数,你需要一个像这样的动作函数:

public function blogViewAction($year, $month, $day) {
    // ...
}

这样,$year将填充来自网址的year参数,$month填充month$day填充day。 url中变量的名称必须与参数名称匹配。

如果你想使用请求对象并且你在控制器中,你可以从依赖注入容器中请求它,如下所示:

$request = $this->get('request');

这是在控制器中定义操作的方法。您对路线的定义应如下所示,与@scube说的相同:

/**
 * @Route("/thing/add/{id}", name="addThing")
 */
public function addThing($id) {
    // ...
}

运行php app/console router:debug,检查您的路由是否已在Symfony2中注册。这将打印项目中框架已知的每个路径。检查名称addThing是否存在且网址映射是否正常。

最后,即使范围修饰符不是必需的(publicprotectedprivate),因为public是默认值,因此始终指定一个是一个很好的约定

希望这有帮助。

的问候,
马特

答案 1 :(得分:0)

首先:为什么错误消息提到“addNote”而不是“addThing”? 第二:为了在你的网址中使用id值,你需要定义你的函数:

function addThing($id) { ... }