我有一条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"
它有效...但我如何访问该表单操作的路由?
答案 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
是否存在且网址映射是否正常。
最后,即使范围修饰符不是必需的(public
,protected
,private
),因为public
是默认值,因此始终指定一个是一个很好的约定
希望这有帮助。
的问候,
马特
答案 1 :(得分:0)
首先:为什么错误消息提到“addNote”而不是“addThing”? 第二:为了在你的网址中使用id值,你需要定义你的函数:
function addThing($id) { ... }