Symfony 2 URL参数?

时间:2013-10-14 00:18:11

标签: php symfony yii url-rewriting url-routing

我习惯了Yii的URL管理:

site.com/controller/action/var1/value1/var2/value2

这样我可以在URL中以任何顺序放置我的变量,或省略一个并具有默认值asigned:

public function actionFoo( $var1=22, $var2 ) { //Var1 is optional, Var2 must come.
}

Symfony有这样的东西吗?我已经搜索了但是我发现只有硬编码的URL位置,比如CodeIgniter,这是我觉得非常讨厌的东西,因为如果我在URL的中间有一个参数,我需要给它一个值。

示例:

  

site.com/controller/action/false/false/value3

也许我所使用的也是一种不好的做法,我愿意以其他方式学习。

由于

2 个答案:

答案 0 :(得分:1)

Symfony并没有这样做。

如果需要将值映射到变量名,则需要使用查询字符串:?var1=value1&var2=value2

然后,在您的控制器中,您可以执行$this->get('request')->query->get('var1', false)(如果false未设置,则var1为默认值。

否则你可以定义a default value in your route,但它不会像你期望的那样工作。

您可以扩展路由组件以模仿Yii的路由系统,但我不建议它,因为它需要一些时间。

All-in-all查询字符串将完全符合您的预期。

答案 1 :(得分:1)

我也发现它有点烦人,但通过一些工作,你可以通过设置多个路由到同一控制器方法使URL在Symfony中工作。捕获的顺序确实很重要。

此示例使用注释,但您可以使用YAML,XML和PHP执行相同的操作。

/**
 * @Route("/whatever/{var2}/{var1}", name="whatever_allvars")
 * @Route("/whatever/{var2}", name="whatever_onevar")
 * @Template()
 */
public function actionFoo( $var1=22, $var2 ) { 
   //Var1 is optional, Var2 must come.
}

这将允许以下网址:

site.com/whatever/var2/var1
site.com/whatever/var2

如果你真的想让它与样本网址匹配,你可以像这样设置它。

/**
 * @Route("/controller/action/var1/{var1}/var2/{var2}", name="whatever_allvars")
 * @Route("/controller/action/var1/{var1}", name="whatever_onevar")
 * @Template()
 */
public function actionFoo( $var1, $var2=22 ) { 
   //Var2 is optional, Var1 must come.
}

这将允许以下网址:

site.com/controller/action/var1/value1/var2/value2
site.com/controller/action/var1/value1

希望这能让您了解Symfony可以做些什么。