我习惯了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
也许我所使用的也是一种不好的做法,我愿意以其他方式学习。
由于
答案 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可以做些什么。